为什么在这种情况下数组解构不起作用?

6

我想要交换数组arr的成员。 但是输出结果却是[0, 0]。 我期望得到的是[1, 0]。

const arr = [0, 1];
[arr[1],arr[0]] = arr;
console.log(arr)

但在执行此操作时,它输出了 [1, 0],我认为我理解了。

const arr = [0, 1];
[arr[1],arr[0]] = [arr[0], arr[1]];
console.log(arr)


7
解构赋值修改了数组。arr[1]变成了0,接着arr[0]也变成了0 - evolutionxbox
你想做什么?你发布的代码很奇怪,也不太有意义。 - Pointy
@Utshav - 我在我的回答中把数组索引搞反了,这可能让人难以理解。我已经修正了它们。 - T.J. Crowder
1个回答

6
你的第一个例子既对 arr 数组进行了修改,又从同一数组中获取其值,就像这样:

const arr = [0, 1];
// Here, `arr` is `[0, 1]`
arr[1] = arr[0];      // <=== Changes `arr[1]`...
// Now, `arr` is `[0, 0]`
arr[0] = arr[1];      // <=== ...so the new value of `arr[1]` is used here.
// Still `[0, 0]`

你的解构赋值也在进行相同的操作:在解构赋值操作修改了arr之后,仍然使用arr[1]
你的第二个示例修改了arr指向的数组,但只有在从数组中获取旧值并将其放入一个新数组后才这样做。
const arr = [0, 1];
const newArray = [arr[0], arr[1]];
// Here, `arr` is `[0, 1]`, `newArray` is `[0, 1]`
arr[1] = newArray[0]; // <=== Changes `arr[1]`...
// Here, `arr` is `[0, 0]`, `newArray` is still `[0, 1]`
arr[0] = newArray[1]; // <=== ...but that doesn't affect `newArray[1]`, so this works.
// Here, `arr` is `[1, 0]`, `newArray` is still `[0, 1]`

这行代码是可行的,因为虽然使用解构赋值改变了arr[1]的值,但是arr[0]的新值并不是来自arr[1],而是来自newArray[1]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接