解构赋值
从数组或者对象中提取值,按照对应位置,对变量赋值,对象也可以实现解构
let [a,b,c] = [1,2,3,4,5] // a=1,b=2,c=3
let [a,b,c] = [1,2] // a=1,b=2,c=undefined
let [a,,b] = [1,2,3] // a=1 b=3 跳过其中的值
对象的解构赋值
let {name,age} = {name:11,age:22}
console.log(name) // 11
console.log(age) // 22
变量必须与属性同名,才能取到正确的值。
let { foo, bar } = { foo: 'aaa', bar: 'bbb' };
// 实际上
let { foo: foo, bar: bar } = { foo: 'aaa', bar: 'bbb' };
对象解构中,属性名(name)只用来匹配
解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。
等号右边只要是可遍历数据就可以用来解构赋值
如果解构不成功,其值为 undefined
还可以用来设置默认值:
ES6 内部使用严格相等运算符(===),判断一个位置是否有值。所以,只有当一个数组成员严格等于undefined,默认值才会生效
let [a,b=1] =[1,2] // a=1 b = 2
// 如果b没有值,那将是默认值1
只要有可能,就不要在模式中放置圆括号。
解构赋值虽然很方便,但是解析起来并不容易。对于编译器来说,一个式子到底是模式,还是表达式,没有办法从一开始就知道,必须解析到(或解析不到)等号才能知道。由此带来的问题是,如果模式中出现圆括号怎么处理。ES6 的规则是,只要有可能导致解构的歧义,就不得使用圆括号。
但是,这条规则实际上不那么容易辨别,处理起来相当麻烦
赋值语句的非模式部分,可以使用圆括号