1.数组的结构赋值
从数组或者对象里面提取值,对变量赋值,这被称为解构赋值。
1)模式匹配
var [ a , b , c ] = [ 1 , 2 , 3 ] //模式匹配 a=1,b=2,c=3
let [ x , y , ...z] = [ 'a' ] //x='a',y=undefined,z=[ ]
2)解构不成功
如果解构不成功,变量的值就等于undefined,例如:
let [ x , y ] = [ ]
let [ x , y ] = [1]
3)解构不完全
let [ x , y ] = [ 1 , 2 , 3 ] //x=1,y=2
4)默认值
[ x , y = 1] = [ 2 ] // x = 2 ,y = 1
[ x , y = 1] = [ 2 , undefined ] // x = 2 ,y = 1
[ x , y = 1] = [ 2 , null ] // x = 2 ,y = null 注意:如果一个数组成员不严格等于undefined,默认值是不会生效的。
2.对象的结构赋值
let { foo : foo , baz : baz} = { foo : 1, baz : 2} //foo = 1,baz = 2
let { foo , baz} = { foo : 1, baz : 2} //foo = 1,baz = 2
let { foo : f , baz : b} = { foo : 1, baz : 2} //f = 1,b = 2
1)对于对象的解构赋值,变量的声明和赋值是同时进行的,所以一旦赋值的变量以前生命果就会报错(指用let , const 申明的变量)。
let foo;
let { foo } = { foo : 1} // 这样写是错的
2)默认值
var { x , y = 5} = { x : 1} //x =1 , y = 5
其他情况和数组的相同
3)错误情况
var { foo : { bar } } = { baz : ' baz' } //foo为
var x;
{ x } = { x : 1} //错误大括号不可放在行首 ,应该改为({ x } = { x : 1})
3.字符串的解构赋值
const [ a , b , c ,d , e ] = ' hello ' // a = 'h' ..............
let { length : len } = ' hello ' // len = 5;
4.圆括号问题
建议:只要可以,就不要在模式中放置圆括号
变量声明语句中不能带圆括号;
函数参数中不能带圆括号;
不能将整个模式或者嵌套模式里的一层放在圆括号中;