一 、 let,const
1)let和const不存在变量提升 2)let:块级作用域 3)const:声明的变量不允许改变,声明的时候必须赋值 4)对于复合类型的变量(如数组,对象),const保存的只是地址,里面的内容是可以改变的,想要整个对象都不允许改变,可以使用Object.freeze()方法 5)一切用var声明的全局变量都是window的属性 6)有声明和没有声明的全局变量都会成为window的属性,有什么区别呢? 没有声明的变量可以被删除,而声明的不可以 7)用let ,const 和 calss声明的全局变量不归window所有
二、 解构赋值
可以设置默认值,
let a = [0,1,2,3] let b = [...a] b.push(4) console.log(a) // [0,1,2,3] console.log(b) // [0,1,2,3,4]
对象解构:对象的解构赋值是根据key值进行匹配
let {name="swr",age} = {age:28}
三、箭头函数
对象
const obj = {
x: 1,
print: () => {
console.log(this === window); // => true
console.log(this.x); // undefined
}
};
obj.print();
原型
function Cat (name) {
this.name = name;
}
# Cat.prototype.sayCatName = () => {
console.log(this === window); // => true
return this.name;
};
const cat = new Cat('Miao');
cat.sayCatName();
四、async、await
# async用于申明function异步,await用于等待一个异步方法执行完成 async函数返回一个 Promise 对象async函数内部return语句返回的值,会成为then方法回调函数的参数async 函数内部抛出错误,会导致返回的 Promise 对象变为reject状态,抛出的错误对象会被catch方法回调函数接收到
正常情况下,await命令后面是一个Promise对象。如果不是,会被转成一个立即resolve的Promise对象。****await命令后面的 Promise 对象如果变为reject状态,则reject的参数会被catch方法的回调函数接收到Promise 对象的状态变化:async函数返回的 Promise 对象,必须等到内部所有await命令后面的 Promise 对象执行完,才会发生状态改变,除非遇到return语句或者抛出错误。也就是说,只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数。
只要一个await语句后面的 Promise 变为reject,那么整个async函数都会中断执行
前一个异步操作失败,也不要中断后面的异步操作。这时可以将第一个await放在try...catch结构里面,这样不管这个异步操作是否成功,第二个await都会执行
五、Class
class可以看作只是一个语法糖,通过class关键字,可以定义类。让对象原型的写法更加清晰、更像面向对象编程的语法。类和模块的内部,默认就是严格模式,所以不需要使用use strict指定运行模式constructor方法和实例对象
Class类 本质是函数
类定义不会被提升,这意味着,必须在访问前对类进行定义,否则就会报错
类中方法不需要 function 关键字。方法间不能加分号。
构造器(constructor)中的属性和方法在新的实例对象中也有
写在构造器(constructor)的方法实际是在原型链中的即prototype继承关系
六、Promise
Promise 是异步编程的一种解决方案,其实是一个构造函数,自己身上有all、reject、resolve这几个方法,原型上有then、catch等方法 resolve是对promise成功时候的回调,它把promise的状态修改为
fullfiled,那么,reject就是失败的时候的回调,他把promise的状态修改为rejected,这样我们在then中就能捕捉到,然后执行“失败”情况的回调。 与Promise对象方法then方法并行的一个方法就是catch,与try catch类似,catch就是用来捕获异常的,也就是和then方法中接受的第二参数rejected的回调是一样的