我想使用解构赋值交换元组的元素,如下所示:
var a = [1,2];
[a[1], a[0]] = a;
然而,这会产生[1, 1]
。
Babel将其编译为
a[1] = a[0];
a[0] = a[1];
我原以为这应该编译为
let tmp0 = a[0];
let tmp1 = a[1];
a[0] = tmp1;
a[1] = tmp0;
Traceur的行为与babel完全相同。所以我猜这是指定的行为?
我想交换两个元素到位。这是唯一的方法......
let tmp = a[0];
a[0] = a[1];
a[1] = tmp;
但我认为以上是解构分配应该让我避免不得不这样做。
我完全有能力颠倒数组中两个元素的顺序,所以这不是我的问题。我可以做一些像a.push(a.shift())
这样简单的事情,它符合交换到位的标准。
我最感兴趣的是为什么解构不会像它应该的那样运作。
答案 0 :(得分:7)
我只是使用一个函数来执行此操作
let swap = ([a,b]) => [b,a];
swap([1,2]); // => [2,1]
答案 1 :(得分:4)
我原以为这应该编译为
let tmp0 = a[0]; let tmp1 = a[1]; a[0] = tmp1; a[1] = tmp0;
不,在分配值之前不会检索这些值。或者两者都不是a
的副本,从中检索值。只有一个引用数组;你的代码相当荒谬
{
const tmp = a;
a[1] = tmp[0];
a[0] = tmp[1]; // here, tmp[1] has the "wrong" value because a===tmp
}
或者实际上,它会在迭代数组的迭代器中,而[…]
中的左侧引用被赋值。
答案 2 :(得分:3)
这个怎么样:
var a = [1,2];
a = a.reverse();
答案 3 :(得分:3)
作为替代方案,您可以使用System.Linq
:
slice
答案 4 :(得分:2)
这适用于支持解构的Firefox:
(function () {
"use strict";
var a = [0, 1];
[a[1], a[0]] = [a[0], a[1]];
console.log(a);//[1, 0]
}());