ES6解构赋值详解-数组

解构-数组 详解及各种使用场景。

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];

有了解构之后会非常的简便,下面来看下怎么使用吧。

各种使用场景:

  1. 获取数组内的元素。
/*第一种使用*/
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,所以将默认值覆盖了。

  1. 函数参数的使用:
    这里需要知道如果 函数参数 采用解构模式,则函数必须传入实参,否则会报错。而且参数必须是以数组形式传入
/*原始写法*/
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   []

其实嵌套使用,还是遵循以上规则。只是多套了一层或几层数组而已。

猜你喜欢

转载自blog.csdn.net/qq_41709082/article/details/84545063