使用解构赋值交换元组元素

时间:2015-08-07 17:28:51

标签: javascript swap ecmascript-6 destructuring

我想使用解构赋值交换元组的元素,如下所示:

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())这样简单的事情,它符合交换到位的标准。

我最感兴趣的是为什么解构不会像它应该的那样运作。

5 个答案:

答案 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]
}());