我正在阅读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]
答案 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];
请注意a
,b
,c
或d
的位置对应于数组arr
的索引,如果您编写< / p>
[a, c, b, d] = arr;
你真正的意思是
a = arr[0];
c = arr[1];
b = arr[2];
d = arr[3];
答案 3 :(得分:0)
它只是结合两个步骤进行解构,并在一步中将值添加到arr2
。就像你这样做一样。
var a1 = [1, 2, 3],
a2 = [];
var [one, two, three] = a1;
a2[0] = two;
a2[1] = three;
a2[2] = one
console.log(a2)
&#13;