ES6解构:阵列重新排序机制

时间:2017-02-20 14:50:51

标签: javascript arrays ecmascript-6 destructuring

我正在阅读Kyle Simpson's book (You don't Know JS - ES6 and beyond),他在重新排序数组时给出了这个例子:

 var a1 = [ 1, 2, 3 ],
    a2 = [];

[ a2[2], a2[0], a2[1] ] = a1;

console.log( a2 );                  // [2,3,1]

有人可以帮我理解发生了什么(我期待它返回[3,1,2])。如果我输入其他元素,则会更加混乱:

[ a2[2], a2[0], a2[0] ] = a1; // [3, undefined, 1]
[ a2[1], a2[0], a2[0] ] = a1; // [3, 1]

4 个答案:

答案 0 :(得分:3)

您可以使用Babel's REPL找出代码编译的内容。 (我已用附加注释注释了输出。)

var a1 = [1, 2, 3],
    a2 = [];

a2[2] = a1[0];  // a1[0] = 1
a2[0] = a1[1];  // a1[1] = 2
a2[1] = a1[2];  // a1[2] = 3
console.log(a2); // [2,3,1]

答案 1 :(得分:1)

解构模式中的位置映射到源数组中的索引。所以它相当于:

a2[2] = a1[0];
a2[0] = a1[1];
a2[1] = a1[2];

您期望的结果将来自:

a2 = [ a1[2], a1[0], a1[1] ];

这与解构相反。

这一个:

[ a2[2], a2[0], a2[0] ] = a1;

永远不会分配给a2[1],因此您未对该元素进行定义。您分配到a2[0]两次,首先是2,然后是3,所以最终值为3

答案 2 :(得分:1)

实际上很简单。

在ES6中破坏数组基本上是这样的:

如果你有

var arr = [1, 2, 3, 4];

这意味着当你写一些像

这样的东西
[a, b, c, d] = arr;

你实际上在说这个

a = arr[0];
b = arr[1];
c = arr[2];
d = arr[3];

请注意abcd的位置对应于数组arr的索引,如果您编写< / p>

[a, c, b, d] = arr;

你真正的意思是

a = arr[0];
c = arr[1];
b = arr[2];
d = arr[3];

答案 3 :(得分:0)

它只是结合两个步骤进行解构,并在一步中将值添加到arr2。就像你这样做一样。

&#13;
&#13;
 var a1 = [1, 2, 3],
   a2 = [];

var [one, two, three] = a1;
a2[0] = two;
a2[1] = three;
a2[2] = one
console.log(a2)
&#13;
&#13;
&#13;