这周复习完了 js 基础,整理一波~
alert("Hello World!")
console.log("Hello World!")
document.write("Hello World!")
prompt("Please write some words!")
Number:代表数据类型是数值
整数
浮点
数组
String:代表字符串类型 -> 通常是一段文本
Boolean
Undefined:变量未定义
Null:一个变量准备保存一个对象,但是这个对象不确定时,可以先赋值为 null
Object(复杂类型)
BigInt:大整数类型,用于任意长度的整数
Symbol: 用于唯一的标识符
<script>
// 1. Number类型的基本使用:不区分整数类型和浮点数类型
var age = 19
var height = 1.99
// 2. 特殊的数值:
// Ininity:无穷大
var num1 = Infinity
var num2 = 1/0
console.log(num1,num2);
// NaN:not a number(不是一个数字)计算错误得到的结果
var result = 3* "abc"
// 3. 进制表示
var num3 = 100//十进制
var num4 = 0x100//十六进制
var num5 = 0o100//八进制
var num6 = 0b100//二进制
// 4. 数字表示的范围
var max = Number.MAX_VALUE
console.log(max);
var min = Number.MIN_VALUE
console.log(min);
// 5. isNaN
// 判断是否不是一个数字
</script>
<script>
// 1. String基本使用:单引号、双引号、反引号(ES6新增)
var name = "lili"
// 2. 转义字符:\
// 3. 本身属性和方法
var message = "helloworld"
console.log(message.length);
// 字符串操作
var nickName = "code"
var info = "hah"
console.log(nickName + info);
</script>
<script>
// 1,. Boolean的基本使用
var isLogin = true
var isAdmin = false
</script>
<script>
var info
console.log(info);
// 不规范的操作:定义变量没有进行初始化,默认就是undefined
// 定义一个变量需要进行初始化:0,空字符串,null
</script>
<script>
// Object类型
var person = {
name: "lili",
height: 1.88,
age: 99
}
console.log(person);
console.log(person.name);
</script>
Object.freeze(obj)
<script>
// Null类型
var age = 0//Number类型初始值
var isAdmin = false//Boolean类型初始值
var message = ""//空字符串
// 以上都转化为false
var books = {}//true
var book = null//建议对象初始化为null
console.log(book);//null
// 存在意义:对对象进行初始化
console.log(typeof null);//Object
</script>
<script>
var num = 123
var age = 18
var isAdmin = false
// 一、隐式转换
// 1. 一个字符串和其他类型进行+操作
var numStr = num1 + ""
var ageStr = age + ""
var isAdminStr = isAdmin + ""
console.log(numStr, ageStr, isAdminStr);
console.log(typeof numStr, typeof ageStr, typeof isAdminStr);
// 2. 某些函数的执行会自动将参数转化为字符串
console.log(num);
// 二、显式转换:String()函数、toString()
var numStr1 = String(num)
</script>
<script>
// 一、隐式转换
var num1 = "1234"
var num2 = "9"
var result1 = num1 + num2
console.log(result);
// *:转化为数字
var result2 = num1 * num2
console.log(result2);
// 二、显式转换:Number()
var result3 = Number(num1)
// 其他类型转化为数字类型
// 1. undefined:NaN
console.log(Number(undefined)); //NaN
// 2.null:内存地址,本来说是0,其实是false
console.log(Number(null));
// 3.true:1 false:0
console.log(Number(true));
console.log(Number(false));
// 4.string:
// 前后有很多空格会去除空格,如果剩余字符串为空转化成0
// 只包含数字:给你转化成数字
// 不是数字:NaN
</script>
<script>
// 隐式转换
// 分支语句
var isAdmin = true
var num1 = 123 //true
// 先将其他类型转化成boolean类型,进行语句判断
// 这里是隐式转换
// 隐式转换有如下规则:
// 0、空字符串""、undefined、null、NaN---->false
// 其他值--->false
if (num1) {
}
// 显式转换:Boolean()
console.log("");//false
console.log("0")//true
console.log(Boolean(num1));
</script>
运算符 | 运算规则 | 范例 | 结果 |
---|---|---|---|
+ | 加法 | 2 + 3 | 5 |
+ | 连接字符串 | ‘中’+‘国’ | ‘中国’ |
_ | 减法 | 2 - 3 | -1 |
* | 乘法 | 2 * 3 | 6 |
/ | 除法 | 5 / 2 | 2.5 |
% | 取余 | 5 % 2 | 1 |
** | 幂 | 2 ** 3 | 8 |
== | 相等 | 4 == 3 | false |
!= | 不相等 | 4 != 3 | true |
> | 大于 | 4 > 3 | true |
< | 小于 | 4 < 3 | false |
>= | 大于等于 | 4 <= 3 | false |
<= | 小于等于 | 4 >= 3 | false |
<script>
// 如果条件成立, 那么执行代码块
// 如果条件不成立, 执行另一段代码块
if (条件判断) {
// 条件成立, 执行代码块
} else {
// 条件不成立, 执行代码块
}
if (条件1) {
// 代码块1
} else if (条件2) {
// 代码块2
} else if (条件3) {
// 代码块3
} else {
// 代码块4(所有条件不成立)
}
switch (变量) {
case 常量1:
// 语句一
break
case 常量2:
// 语句二
break
default:
// 语句三
}
</script>
<script>
// 大括号的作用:对象/代码块
// 代码块:
// 结合流程控制是否执行代码块
{
var num1 = 3
var num2 = 9
var num3 = 98
}
// 对象不是代码块
var info = {
name: "lili",
age: 72
}
</script>
<script>
var info = undefined
info = "lili"
var message = info || "我是默认值"
console.log(message.length);
</script>
// 逻辑与的本质
var obj = {
name: "lili",
friend: {
name: "xiejiamiao",
eating: function () {
console.log("想成为一个喜欢干饭的人~~");
}
}
}
obj.friend.eating();
// 最严谨的写法
obj&&obj.friend&&obj.friend.eating&&obj.friend.eating()
<script>
// break:直接跳出循环
var names= ["aaa","bbb","ccc","ddd"]
for(var i = 0;i<4;i++){
console.log(names[i]);
if(names[i]==="ccc"){
break
}
}
// continue:立刻结束本次循环,不执行下面的代码
var names= ["aaa","bbb","ccc","ddd"]
for(var i = 0;i<4;i++){
if(names[i]==="ccc"){
continue
}
console.log(names[i]);
}
</script>
<script>
// 0~1的随机数
// Math.random():[0,1)
for (var i = 0; i < 1000; i++) {
// 得到0~99的数字
var randomNum = Math.random() * 100
randomNum = Math.floor(randomNum)
console.log(randomNum);
}
// 生成一个0~99的随机数
var num = Math.floor(Math.random() * 100)
var isSuccess = false
var count = 7
for (var i = 0; i < count; i++) {
var inputNum = Number(prompt("请输入您猜的数字"))
if (inputNum === num) {
alert("恭喜您猜对了");
break
} else if (inputNum > num) {
alert("猜大了");
} else {
alert("猜小了");
}
if (count - 1 === i) {
alert("您的机会已经用完了!");
}
}
if (!isSuccess) {
alert("您的机会已经用完了!");
}
</script>
<script>
// 1. 获取面积
function getRectangleArea(width, height) {
return width * height
}
var area1 = getRectangleArea(20, 30)
console.log(area1);
function getCircleArea(radius) {
return Math.PI * radius * radius
}
var area2 = getCircleArea(88)
console.log(area2);
// 2. 计算1~n的和
function sumN(n) {
if(n<=0)return
var sum = 0
for (var i = 1; i <= n; i++) {
sum += i
}
return sum
}
var sumN=sumN(99)
console.log(sumN);
</script>
函数有一个特别的对象:argument对象
是所有非箭头函数中都可以使用的局部变量
该对象中包含了所有传入的参数
是一个类数组对象
形参数量不够接收,但是所有实参都放在了 arguments 对象之中
<script>
function foo() {
console.log("foo~~~");
}
// 递归案例
// 方式一:es6
function pow1(x, y) {
return x ** y
}
// 方式二:Math.pow实现
function pow2(x, y) {
return Math.pow(x, y)
}
// 方式三:for循环
function pow3(x, y) {
var result = 1
for (var i = 0; i < y; i++) {
result *= x
}
return result
}
// 方式四:递归实现
// 性能比较低:占用过多的栈内存
// 优点:写出来的代码非常简洁
function pow4(x, y) {
if(y===1) return x
return x * pow4(x, y - 1)
}
</script>
// 递归案例之斐波那契
function fibonacci(n) {
if (n === 1 || n === 2) return 1
return fibonacci(n - 1) + fibonacci(n - 2)
}
// for循环实现斐波那契
function fibonacci(n) {
if (n === 1 || n === 2) return 1
var n1 = 1
var n2 = 1
var result = 0
for (var i = 3; i <= n; i++) {
result = n1 + n2
n1 = n2
n2 = result
}
return result
}
<script>
//1. message的作用域: message在哪一个范围内可以被使用
// 全局变量:全局作用域
var message = "hellolili"
if (true) {
console.log(message);
}
function foo() {
console.log("在foo中访问message:", message);
}
foo()
// 2. es5之前没有块级作用域(var 定义的变量没有块级作用域)
{
count = 100
console.log("在代码块中访问count:", count);
}
console.log("在代码块外面访问count:", count);
// for循环的代码块叶没有自己的作用域
for (var i = 0; i < 3; i++) {
var foo = "foo"
}
console.log("for循坏外面访问foo:", foo);
console.log("for循环外面访问i:", i);//3
// 3. es5之前函数代码块会形成自己的作用域
// 意味着在函数内部定义的变量外面是访问不到的
function test() {
var bar = "bar"
}
test()
// console.log("在test外面访问bar:", bar);
// 函数有自己的作用域:函数内部定义的变量只有函数内部能访问到
function sayHello() {
var nickname = "kobe"
console.log("在sayHello内部访问nickName:", nickname);
function sayHi(){
console.log("hiFunction!exec......");
console.log("在hi函数中访问nickname:",nickname);
}
sayHi()
}
sayHello()
// console.log("在sayHello外面访问nickName:", nickname);
</script>
<script>
// 打印undefined
console.log(message);
// 全局变量(global variable):在script中定义一个变量,哪哪都可以使用
var message = "message"
// 局部变量(local variable):在函数内部定义的变量只有在函数内部才能进行访问,定义在函数内部的变量
// 外部变量(outer variable):在函数内部去访问函数之外的变量,这个变量就是外部变量
</script>
函数的声明:使用 function 定义
函数表达式: var bar = function(){}
<script>
//函数的声明
function foo(){
}
// 函数表达式:允许省略函数名字
var bar = function(){
console.log("bar函数被执行了~~");
}
</script>
<script>
// 函数作为头等公民
// 1. 函数可以赋值给变量(函数表达式写法)
// 匿名函数赋值给 foo1
var foo1 = function () {
console.log("foo1函数被执行");
}
foo1()
// 2. 让函数在变量之间来回传递
var foo2 = foo1
foo2()
// 3. 函数可以作为另外一个函数的参数
function bar(fn) {
console.log("fn:", fn);
}
bar(foo1)
// 4. 函数作为另外一个函数的返回值
function sayHello(name) {
function hi() {
console.log(" hi " + name);
}
return hi
}
var fn = sayHello("lili")//函数柯里化
fn()
// 5. 将函数存储在另外一个数据结构中
var obj = {
name: "lili",
eating: function () {
console.log("eating~~");
}
}
obj.eating()
function bar1() {
console.log("bar1");
}
function bar2() {
console.log("bar2");
}
function bar3() {
console.log("bar3");
}
// 事件总线的封装
var fns = [bar1, bar2, bar3]
</script>
<script>
// 1. 函数回调的概念理解
function foo(fn) {
// 函数的回调:通过fn去调用bar函数的过程
fn()
console.log("foo执行~~");
}
function bar() {
console.log("bar函数执行");
}
foo(bar)
// 2. 函数回调的案例
function request(url, callback) {
console.log("根据URL向服务器发送网络请求");
console.log("需要花费比较长的事件拿到对应的结果");
var list = ["javascript", "java", "python"]
callback(list)
}
function handleResult(res) {
console.log("在handleResult中拿到结果", res);
}
request("http://baidu.com", handleResult)
// 3. 案例重构:一般这样应用
function request(url, callback) {
console.log("根据URL向服务器发送网络请求");
console.log("需要花费比较长的事件拿到对应的结果");
var list = ["javascript", "java", "python"]
callback(list)
}
// 传入的函数是没有名字的,成为匿名函数
request("http://baidu.com", function (res) {
console.log("在handleResult中拿到结果", res);
})
</script>
<script>
// 定义函数,定义完这个函数之后,会要求这个函数立即被执行
// ():前面加一个小括号表示一个整体
(function () {
console.log("函数立刻被执行!!!");
})();
// 注意!!前面的语句要加一个 分号
// {}代码块/对象类型
// ()控制优先级/函数的调用/函数的参数
// []定义一个数组/从数组/对象中取值/对象的计算属性
// 定义完之后立即执行可以不写名字
// 可以传入参数、可以有返回值,跟普通的函数是一样的
(function () {
console.log("立即执行函数的调用");
})()
</script>
var xmModule = (function () {
var xmModule = {}
var message = "hello lilei";
console.log(message);
var nickname = "nickname是啥";
console.log(nickname);
console.log(nickname.length);
xmModule.message = message
return xmModule
})();
(function () {
console.log(xmModule.message.length);
})();
<!-- 应用二案例 -->
<button class="btn">按钮一</button>
<button class="btn">按钮二</button>
<button class="btn">按钮三</button>
<button class="btn">按钮四</button>
<script>
// 1. 获取一个按钮监听点击
// 1. 拿到html元素
// var btnEl = document.querySelector(".btn")
// console.log(btnEl);
// // 2. 监听对应按钮的点击
// btnEl.onclick = function(){
// console.log("点击按钮一")
// }
// 2. 获取所有的按钮监听点击
var btnEls = document.querySelectorAll(".btn")
for (var i = 0; i < btnEls.length; i++) {
var btn = btnEls[i];
(function (m) {
btn.onclick = function () {
// 使用var,i是在上层作用域找到的-->全局
console.log(`按钮${m + 1}发生了点击`);
}
})(i)
}
(function (m) {
console.log(m);
})(0)
</script>
// 常见写法
(function () {
console.log("立即执行函数被调用!");
})()
// 错误写法:函数声明不能立即调用
// function foo(){
// 这里的小括号当成了优先级
// }()
// 其他写法
(function () { })
//类似于以下的写法,类似于函数表达式
function foo(fn) {
}
foo(function () {
})
// 让匿名函数直接执行
(function (fn) {
}());
// +号让其变成表达式
+function foo(){
}()
// 1. foo和()之间不需要有空格
// 2. 多参数,后面加上一个空格
// 3. 小括号和大括号之间有一个空格
// 4. {和其他函数定义定义在同一行
面向对象:研究对象之间的关系
<script>
/*
函数(function):通过function默认定义一个结构
方法(method):将一个函数放到对象中,作为对象的一个属性
*/
var person = {
name: "lili",
age: 18,
height: 1.63,
run: function () {
console.log("这是一个喜欢跑步的人~~~");
},
study: function () {
console.log("期末考来临不得不学习");
}
}
</script>
<script>
/*
函数(function):通过function默认定义一个结构
方法(method):将一个函数放到对象中,作为对象的一个属性
*/
// 定义了一个对象
var person = {
name: "lili",
age: 18,
height: 1.63,
run: function () {
console.log("这是一个喜欢跑步的人~~~");
},
study: function () {
console.log("期末考来临不得不学习");
},
"my friend":{
name:"jiamiao"
}
}
// 访问/修改/添加对象的属性
console.log(person.name);
person.name="lili"
person.study = function(){
console.log("学~~~");
}
// 删除属性
delete person.height
</script>
<script>
var obj = {
name: "lili",
"my friend": "kobe",
"eating something": function () {
console.log("eating~~~");
}
}
console.log(obj["my friend"]);
console.log(obj.name === obj["name"]);
var eatingKey = "eating something"
obj["eating something"]()
// 也还是要用[]进行使用
obj[eatingKey]()
</script>
<script>
var info = {
name: "lili",
age: 12,
height: 1.88
}
// 对对象进行遍历
// 1. 普通for循环:要用到索引值i
// 循环次数的确定:Object.keys(info)返回了一个数组,进而得到数组的长度
console.log(Object.keys(info));
var infoKeys = Object.keys(info)
for (var i = 0; i < infoKeys.length; i++) {
var key = infoKeys[i]
// key值保存在一个变量里面,不能用.的方式取出来,要用[]
var value = info[key]
console.log(`key:${key},value:${value}`);
}
//2. for in :遍历对象,不需要用到索引值i
for (var key in info) {
// 一开始就拿到了key
console.log(key);
var value = info[key]
console.log(value);
}
// 3. for of:默认不能遍历对象,要求遍历对象是一个可迭代对象iterable,支持数组
for (var foo of info) {
}
</script>
<script>
var num1 = 123
var num2 = 123
console.log(num1 === num2);//true
// 1. 两个对象的比较
var obj1 = {
}
var obj2 = {
}
console.log(obj1 === obj2);//false
// 2. 引用的赋值:会直接修改内存中的值
var info = {
name: "lili",
// 只要是对象类型就会重新开辟一个内存空间
friend: {
name: "kebe"
}
}
var friend = info.friend
friend.name = "james"
console.log(info.friend.name);//james
// 3. 值传递和引用传递的区别
// 3.1值传递
function foo(a) {
a = 321
}
var num = 100
// 函数执行完会被销毁
foo(num)
console.log(num);//100
// 3.2引用传递:但是在函数中创建了一个新对象,没有对传入对象进行修改
function bar(a) {
// 变量a创建了一个新的内存地址去保存对象
a = {
name: "lili"
}
}
var obj = { name: "obj" }
// 将对象传进去
bar(obj)
// obj从始至终没有改变过
console.log(obj.name);
// 3.3引用传递:但是对传入的对象进行修改
var obj = {
name: "obj"
}
function baz(a) {
a.name = "lili"
}
baz(obj)
console.log(obj.name);
</script>
<script>
// 普通函数中都有一个this变量:在大多数情况下会指向一个对象
// arguments:保存的是传入的所有参数
// 1. 情况一:普通函数被默认调用,this指向window
function foo(name, age) {
console.log(arguments);
console.log(this);//window对象
}
foo("lili", 123)
function sayHello() {
console.log(this);
}
sayHello()
// 2. 情况二:函数是被某一个对象引用并且调用它,this会指向这个对象(调用的那个对象)
var obj = {
// 函数没有谁属于谁,看谁调用的,谁就是this
running: function () {
console.log("I LIKE RUNNING");
console.log(this === obj);
}
}
obj.running()//true
// 将running这个函数赋值给fn
// 引用的赋值
// 题目一:
var fn = obj.running
fn()//window
// 题目二:
function bar() {
console.log("bar function~~");
console.log(this);
}
var person = {
name: "lili",
bar: bar
}
person.bar()//person
</script>
<script>
// 对象没有作用域,只是一种数据类型
var info = {
name: "lili",
running: function () {
console.log(this.name + " is running");
},
eating: function () {
console.log(this + " is eating");
},
studying: function () {
console.log(this + " is studying");
}
}
info.running()
</script>
<script>
// 一系列的学生对象
// 重复代码的复用
var stu1 = {
name: "lili",
age: 19,
height: 1.88,
running: function () {
console.log("running~~");
}
}
var stu2 = {
name: "kobe",
age: 29,
height: 1.98,
running: function () {
console.log("running~~");
}
}
var stu3 = {
name: "jully",
age: 23,
height: 1.48,
running: function () {
console.log("running~~");
}
}
</script>
<script>
// for循环
for (var i = 0; i < 3; i++) {
var stu = {
name: "lili",
age: 19,
height: 1.88,
running: function () {
console.log("running~~");
}
}
}
// 工厂函数:生产student对象
//通过工厂设计模式,自己来定义了一个这样的函数
function createStudent(name, age) {
var stu = {}
stu.name = name
stu.age = age
stu.running = function () {
console.log("runnning");
}
return stu
}
var stu1 = createStudent("lili", 34)
</script>
<script>
// JavaScript已经默认提供给了我们可以更加符合JavaScript思维方式的一种创建对象的规则
// 思维方式:面向对象
/*
如果一个函数被new操作符调用:
1. 创建出来一个新的空对象
2. 将空对象赋值给this(让this指向这个空对象)
3. 执行函数体代码块
4. 如果没有明确的返回一个非空对象,那么这个this指向的对象会自动返回
*/
function Student(name, age, height) {
// 在函数中的this一般指向某一个对象
this.name = name
this.age = age
this.height = height
this.running = function () {
console.log("runnning");
}
}
// 在函数调用的前面加new操作符(关键字)
var stu1 = new Student("lili", 34, 1.33)
var stu2 = new Student("jiao", 34, 22)
console.log(stu1);
console.log(stu2);
</script>
<script>
//定义原始类型的变量
//地址、指针、引用
var name = "lili"
var age = 19
// 定义对象类型的变量
var obj = {}
var foo = function(){}//堆内存
function bar(){} //堆内存
console.log(typeof obj);//object
// 规范有规定,函数返回function,但是它属于object,它只是返回更加具体的类型
console.log(typeof bar);//function
// 举例:学生属于人是吧!!!
// 本质:Function继承Object
function sayHello(){
}
// 对象可以往里面放属性
sayHello.age =19
function Dog(){
}
// 对象可以往里面放函数
// 构造函数上(类上面)添加的函数,称之为类方法
Dog.running = function(){}
</script>