解构-数组 详解及各种使用场景。
1.ES6中引入了新的取值方法:解构
这篇文章主要讲其中一种模式的使用—数组解构,另一种对象模式的结构参看我的另一篇文章。
使用格式: let [变量名,…]=[数组元素]; 赋值的时候是一一对应的,第一个变量取到的值是对应数组内第一个元素。
这里结构只能对数组,对象使用。
let [x,y,z]=undefined;
let [a,b,c]=null;
//报错,因为undefined null 均不能转化为obj
let [x,y,z]='abc';
console.log(x,y,z);// a b c;
//这里浏览器将字符串abc隐式转化为了obj=====new String('abc');
所以其实任何可以转化为obj,array的都可以使用解构。
原来需要取数组内的值:
let arr=[1,2,3];
let x=arr[0],
y=arr[1],
z=arr[2];
有了解构之后会非常的简便,下面来看下怎么使用吧。
各种使用场景:
- 获取数组内的元素。
/*第一种使用*/
let arr=[1,2,3];
let [x,y,z]=arr; ====== let [x,y,z]=[1,2,3];
console.log(x,y,z);// 1,2,3
情况1:当变量数量与数组内的元素个数不对应时,此时后面没有元素对应的变量,值将为undefined
let [x,y,z]=[1,2];
console.log(x,y,z);// 1 2 undefined
情况2:当数组内有空位元素时,其实此时该位置的值默认为undefined。
let [x,y,z]=[1,,2]; //此时数组=== [1,undefined,2]
console.log(x,y,z); // 1 undefined 2;
当然这些变量也可以有默认值:写法如下
let [x,y,z=3]=[2];
console.log(x,y,z);// 2 undefined 3
这里遵循如果没有匹配到对应元素,则若有默认值,则取默认值,若无还是undefined(就相当与你声明了变量,却没有为它赋值)。
情况3:当有默认值,且又匹配到对应的元素时:
let [x,y=6,z=3]=[1,2];
console.log(x,y,z); // 1 2 3
这里可以看到 x没有取默认值6,而是取了匹配值2,这里其实默认值是遵循一个惰性取值,只有当没有匹配到元素时(这里可以理解为匹配值将默认值覆盖了),才会取默认值。当然当数组的值为undefined时除外,此时变量会取默认值。
let [x=1,y=6,z]=[undefined,2,3];
console.log(x,y,z); // 1 2 3
可以看到x匹配到了值,但是元素为undefined,最终还是取默认值了。而y匹配到的值并不为undefined,所以将默认值覆盖了。
- 函数参数的使用:
这里需要知道如果 函数参数 采用解构模式,则函数必须传入实参,否则会报错。而且参数必须是以数组形式传入。
/*原始写法*/
function test(x,y,z){
console.log(x,y,z);
}
test();//undefined undefined undefined
/*解构写法*/
function test2([x,y,z]){
console.log(x,y,z);
}
test2();//报错
还有需要知道参数默认值与默认传参的区别,形式参数(形参)有默认值,并不代表传了实参。看一个例子:
function test([x=1,y=2,z=3]){
console.log(x,y,z);
}
test();//报错
这里还是会报错,因为还是没有传入参数
正确默认传参:
function test([x,y,z]=[1,2,3]){
console.log(x,y,z);
}
test();//1,2,3
这里如果传入参数,则会把默认传的数组参数覆盖:
function test([x,y,z]=[1,2,3]){
console.log(x,y,z);
}
test([6,,6]);//6 undefined 6
这里有人可能会问为什么不是 6 2 6,当值为undefined时不是取默认值么。
说的好,其实这里面 2 只是默认传入的参数,不是参数变量的默认值,所以不要搞混。
//这样才是默认值
function test([x=1,y=2,z=3]){
console.log(x,y,z);
}
test([,,]);//1 2 3 [, ,]====[undefined,undefined,undefined]
解构的嵌套使用
let [x,[y],z]=[1,[2],[]];
console.log(x,y,z);//1 2 []
其实嵌套使用,还是遵循以上规则。只是多套了一层或几层数组而已。