声明
- var
- let
- const
- function
- class
- improt
作用域
- 全局作用域
- 函数作用域function(){}
- 块级作用域{}
作用范围
- var命令 在全局代码中执行
- const 和 let命令 只能在代码块中执行
赋值使用
- const 声明常量后必须立马赋值
- let命令可立马赋值或者使用时赋值
重点难点
- 不允许重复声明
- 未定义就使用报错:const 和 let 不存在变量提升
- 暂时性死区:在代码块内使用 const 和 let 命令,声明变量之前,该变量都不可用
解构赋值
-
字符串解构: const[a,b,c,d,e] = “hello”
-
数值解构:const{ toString: s } = 123
-
布尔解构: const{ toString: b } = true
-
对象解构
-
形式:const { x, y } = { x: 1, y: 2 }
-
默认:const { x, y = 2 } = { x: 1 }
-
改名:const { x, y: z } = { x: 1, y: 2 }
-
数组解构
-
规则:数据结构具有Iterator接口可采用数组形式的解构赋值
-
形式:const [x, y] = [1, 2]
-
默认:const [x, y = 2] = [1]
-
函数参数解构
-
数组解构:function Func([x = 0, y = 1]) {}
-
对象解构:function Func({ x = 0, y = 1 } = {}) {}
字符串扩展
- Unicode表示法:大括号包含表示Unicode字符(\u{0xXX}或\u{0XXX})
- 字符串遍历:可通过for-of遍历字符串
- 字符串模板:可单行可多行可插入变量的增强版字符串
- 标签模板:函数参数的特殊调用
- String.raw():返回把字符串所有变量替换且对斜杠进行转义的结果
- String.fromCodePoint():返回码点对应字符
- codePointAt():返回字符对应码点(String.fromCodePoint()的逆操作)
- normalize():把字符的不同表示方法统一为同样形式,返回新字符串(Unicode正规化)
- repeat():把字符串重复n次,返回新字符串
- matchAll():返回正则表达式在字符串的所有匹配
- includes():是否存在指定字符串
- startsWith():是否存在字符串头部指定字符串
- endsWith():是否存在字符串尾部指定字符串
克隆数组:
- const arr = […arr1]
- 合并数组:const arr = […arr1, …arr2]
- 拼接数组:arr.push(…arr1)
- 代替apply:Math.max.apply(null, [x, y]) => Math.max(…[x, y])
- 转换字符串为数组:[…“hello”]
- 转换类数组对象为数组:[…Arguments, …NodeList]
- 转换可遍历对象为数组:[…String, …Set, …Map, …Generator]
- 与数组解构赋值结合:const [x, …rest/spread] = [1, 2, 3]
- 计算Unicode字符长度:Array.from(“hello”).length => […“hello”].length
箭头函数(=>):函数简写
- 无参数:() => {}
- 单个参数:x => {}
- 多个参数:(x, y) => {}
- 解构参数:({x, y}) => {}
- 嵌套使用:部署管道机制
- this指向固定化
- 并非因为内部有绑定this的机制,而是根本没有自己的this,导致内部的this就是外层代码块的this
因为没有this,因此不能用作构造函数
Set
- 去重字符串:[…new Set(str)].join(“”)
- 去重数组:[…new Set(arr)]或Array.from(new Set(arr))
- 集合数组
- 声明:const a = new Set(arr1)、const b = new Set(arr2)
- 并集:new Set([…a, …b])
- 交集:new Set([…a].filter(v => b.has(v)))
- 差集:new Set([…a].filter(v => !b.has(v)))
- 映射集合
- 声明:let set = new Set(arr)
- 映射:set = new Set([…set].map(v => v * 2))或set = new Set(Array.from(set, v => v * 2))
Promise
-
定义:包含异步操作结果的对象
状态 -
进行中:pending
-
已成功:resolved
-
已失败:rejected
-
特点
-
对象的状态不受外界影响,一旦状态改变就不会再变,任何时候都可得到这个结果
-
声明:new Promise((resolve, reject) => {})
-
出参
resolve:将状态从未完成变为成功,在异步操作成功时调用,并将异步操作的结果作为参数传递出去
reject:将状态从未完成变为失败,在异步操作失败时调用,并将异步操作的错误作为参数传递出去 -
方法
then():分别指定resolved状态和rejected状态的回调函数 -
第一参数:状态变为resolved时调用
-
第二参数:状态变为rejected时调用(可选)
-
catch():指定发生错误时的回调函数
-
Promise.all():将多个实例包装成一个新实例,返回全部实例状态变更后的结果数组(齐变更再返回)
-
入参:具有Iterator接口的数据结构
-
成功:只有全部实例状态变成fulfilled,最终状态才会变成fulfilled
-
失败:其中一个实例状态变成rejected,最终状态就会变成rejected
-
Promise.race():将多个实例包装成一个新实例,返回全部实例状态优先变更后的结果(先变更先返回)
-
入参:具有Iterator接口的数据结构
-
成功失败:哪个实例率先改变状态就返回哪个实例的状态
-
Promise.resolve():将对象转为Promise对象(等价于new Promise(resolve => resolve()))
-
Promise实例:原封不动地返回入参
-
Thenable对象:将此对象转为Promise对象并返回(Thenable为包- - 含then()的对象,执行then()相当于执行此对象的then())
-
不具有then()的对象:将此对象转为Promise对象并返回,状态为resolved
-
不带参数:返回Promise对象,状态为resolved
-
Promise.reject():将对象转为状态为rejected的Promise对象(等价于new Promise((resolve, reject) => reject()))
-
应用场景
-
加载图片
-
AJAX转Promise对象
-
重点难点
-
只有异步操作的结果可决定当前状态是哪一种,其他操作都无法改变这个状态
-
状态改变只有两种可能:从pending变为resolved、从pending变为rejected
-
一旦新建Promise对象就会立即执行,无法中途取消
-
不设置回调函数,内部抛错不会反应到外部
-
当处于pending时,无法得知目前进展到哪一个阶段
-
实例状态变为resolved或rejected时,会触发then()绑定的回调函数
-
resolve()和reject()的执行总是晚于本轮循环的同步任务
-
then()返回新实例,其后可再调用另一个then()
-
then()运行中抛出错误会被catch()捕获
-
reject()的作用等同于抛出错误
-
实例状态已变成resolved时,再抛出错误是无效的,不会被捕获,等于没有抛出
-
实例状态的错误具有冒泡性质,会一直向后传递直到被捕获为止,错误总是会被下一个catch()捕获
-
不要在then()里定义rejected状态的回调函数(不使用其第二参数)
-
建议使用catch()捕获错误,不要使用then()第二个参数捕获
-
没有使用catch()捕获错误,实例抛错不会传递到外层代码,即不会有任何反应
-
作为参数的实例定义了catch(),一旦被rejected并不会触发Promise.all()的catch()
-
Promise.reject()的参数会原封不动地作为rejected的理由,变成后续方法的参数