数组的解构赋值
数组的解构赋值:按照模式匹配的方式从数组或对象中提取值对变量进行赋值,如果解构不成功,变量的值就等于undefined。
1.如果等号右边是不可遍历的结构就会报错。而对于Set结构可以使用数组的解构赋值。事实上,只要某种数据结构具有 Iterator 接口,都可以采用数组形式的解构赋值。
2.解构赋值允许指定默认值,默认值写在等号左边用方括号括起来,例如:
```
let[a,b=2]=[3,undefined];//设置a、b的默认值为都2,然后在等号右边设置a的值为3,b的值为undefined,结果输出a的值为3,b的值为2.
```
3.当要判断一个位置是否有值时必须让数组的成员严格等于undefined.默认值才会生效
4.如果默认值是一个表达式,那么这个表达式是惰性求值的,即只有在用到的时候才会求值
5.默认值可以引用解构赋值的其他变量,但该变量必须已经声明
对象的解构赋值
1.对象的解构赋值的内部机制实现找到同名属性,然后再赋值给对应的变量。在对对象进行解构赋值时变量必须与属性同名才能取到正确的值,与顺序无关,同时在赋值时被赋值的是等号前面冒号后面的变量。
2.如果变量名与属性名不一致时必须使用以下形式:
```
let{foo:baz}={foo:"aaa",bar:"bbb"};//等号前面表明baz的值与foo的值形同,等号右边把给foo赋值为aaa,当打印baz时自动将baz赋值为与foo一样的值;或者
let obj={first:"hello",last:"world"};let{first:f,last:1}=obj;
let {foo:baz}={foo:"aaa",bar:"bbb"};//打印baz结果为"aaa",打印foo结果报错。说明foo是匹配的模式,真正被赋值的是变量baz,而不是模式foo
```
3.当使用圆括号解构赋值时应使用以下形式:`let x;({x}={x:1});`
4.对象的解构赋值可以赋值到某个变量,例如:`let{log,sin,cos}=Math;`以上代码将Math对象的对数、正弦、余弦三个方法赋值到对应的变量上
字符串的解构赋值
```
const[a,b,c,d,e]='hello';
a // "h"
b // "e"
c // "l"
d // "l"
e // "o"
//类似数组的对象都有一个length属性,let{length:len}='hello';
len//5
```
解构赋值的规则是。只要等号右边的值不是对象或数组,就先将其转化为对象,由于undefined和null无法转化为对象,所以进行解构赋值时都会报错。
函数参数的解构赋值
```
function add([x,y]){//函数add的参数表面上是一个数组,但在传参的那一刻数组参数就被解构成变量x和y
return x+y;
}
add([1,2]);
```