数组的解构赋值

社会主义新天地 提交于 2019-12-30 02:16:38

数组的结构赋值

let a = 1;
let b = 2;
let c = 3;
//ES6 允许写成下面这样。
let [a, b, c] = [1, 2, 3];

这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值

嵌套写法let [foo, [[bar], baz]] = [1, [[2], 3]]; 
foo // 1
bar // 2
baz // 3 

let [ , , third] = ["foo", "bar", "baz"];
third // 'baz' 

let [x, , y] = [1, 2, 3];
x // 1
y // 3

let [head, ...tail] = [1, 2, 3, 4];
head // 1
tail // [2, 3, 4]

let [x, y, ...z] = ['a'];
x // "a"
y // undefined
z // []

如果解构不成功,变量的值为undefined。以下两种情况都属于解构不成功,foo的值都会等于undefined。

let [foo] = [];
let [bar, foo] = [1];

另一种情况是完全不解构,即等号左边的模式只匹配一部分等号右边的数组,但依然可以解构成功。例如下面代码。

let [x, y] = [1, 2, 3];
x // 1
y // 2

let [a, [b], d] = [1, [2, 3], 4];
a // 1
b // 2
d // 4

如果等号右边是不可遍历的解构,那么将会报错。

// 报错
let [foo] = 1;
let [foo] = false;
let [foo] = NaN;
let [foo] = undefined;
let [foo] = null;
let [foo] = {};

上面的语句都会报错,因为他们不具备Iterator接口,也就是说他们不可被遍历。

事实上,只要某种数据结构具有 Iterator 接口,都可以采用数组形式的解构赋值。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!