ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构
数组的解构赋值
- 如果目标对象的结构不符合/不具备iterator接口,都将会报错
结构赋值可以有默认值,当数组中的值完全等于
undefined
,默认值才会生效let [a=1] = []; a //1 // 相当于 let [a=1] = [undefined]; a // 1
可以嵌套使用
let [a, [b],c] = [1, [2], 3]; a // 1 b // 2 c // 3
结构赋值内部使用
===
对象的解构赋值
对象和数组的区别在于,数组通过位置来匹配,而对象是通过属性找到需要被解构的值。
变量使用嵌套进行结构时
let {a, b, b: {c}} = {a: 1, b: {c: 2}};
a // 1
b // {c: 2}
c // 2
上方b:
在这里是模式,必须这样才可以引用到b,来对c进行解构
字符串解构赋值
会把字符串转换成类似数组的对象
所以可以得到字符串的长度
let [a, b, c, d] = 'abcd';
a //"a"
b // "b"
// ...
let {length} = 'abcd';
length // 4
数字和布尔值的解构赋值
数字和布尔值在进行解构赋值时, 会被先转换为对象
let {toString} = 123;
toString === Number.prototype.toString;
undefined 和 null 不能转换为对象,所以解构赋值会报错 typeError
函数参数的解构赋值
function fun({a, b} = {a: 0, b: 0}){}
function fun({a = 0, b = 0}){}
// 两种是完全不同的意思
慎用圆括号
可以使用圆括号的情况只有一种:赋值语句的非模式部分,可以使用圆括号。
let b, d;
[(b)] = [3];
({ p: (d) } = {});
[(parseInt.prop)] = [3];