变量声明命令的比较
| var | let | const | |
|---|---|---|---|
| 变量 | 变量 | 常量(通常大写) | |
| 块级作用域 | ❌ | ✅ | ✅ |
| 变量提升 | ✅ | ❌ | ❌ |
| 挂载在window上 | ✅ | ❌ | ❌ |
| 同作用域下重复声明 | ✅ | ❌ | ❌ |
| 声明必须赋值 | ❌ | ✅ | ✅ |
| 暂时性死区 | ❌ | ✅ | ✅ |
**暂时性死区:**如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
解构赋值
可以使用结构赋值的结构:具有 Iterator 接口的数据结构。
默认值
- ES6 内部使用严格相等运算符(
===),判断一个位置是否有值。所以,只有当一个数组成员严格等于undefined,默认值才会生效; - 如果默认值是一个表达式,那么这个表达式是惰性求值的,即只有在用到的时候,才会求值;
注意
- 当一个已经声明的变量用于解构赋值时,不要将
{}写在行首,否则会解析成代码块从而报错,可以用()包裹起来; - 可以对数组进行对象属性的解构,如下:
let arr = [1, 2, 3];
let {0 : first, [arr.length - 1] : last} = arr;
first // 1
last // 3
用途
- 交换变量
- 从函数返回多个值
- 函数参数的定义
- 提取JSON数据
- 函数参数的默认值
- 遍历Map结构
- 引入模块的指定方法
扩展运算符
rest参数的逆运算
用途
- 复制数组
- 合并数组
- 与解构赋值结合
- 字符串转数组
函数扩展
箭头函数
this指向定义时所在对象- 不可以当作构造函数
- 没有
arguments函数,使用rest参数
不适用箭头函数的情况
- 对象当中的方法使用到this,应使用普通函数==否则this指向全局==
- 动态的this,应使用普通函数==动态指向调用函数的元素==
- 复杂并且有大量读写操作的函数,应使用普通函数==提高可读性==
rest参数
- rest参数之后不能有其他参数
- 函数的length属性,不包括rest参数
数组扩展
| 方法 | 作用 | 描述 |
|---|---|---|
| Array.from() | 类数组=>数组 | 任何有length属性的对象都可以转换 |
| Array.of() | 一组值=>数组 | 基本上可以代替Array()和new Array() |
| find() | 返回第一个符合条件的数组成员,没有即为undefined | 可以发现NaN |
| findIndex() | 返回第一个符合条件的数组成员的位置,没有即为-1 | 可以发现NaN |
| includes() | 是否包含给定的值 | 第二个参数是搜索起始位置 |
| flat() | 多维数组=>一维数组 | 参数是拉平的层数 |
| flatMap() | 对每个成员执行一个函数后拉平 | 只能展开一层 |
对象扩展
属性的简洁表示法
- 属性名和变量名相同可以省略
fn: function(){}=>fn(){}
属性名表达式
表达式可以作为属性名、方法名,但是和简洁表示法不能混用会报错