ES2015 +嵌套休息说明

时间:2016-09-01 17:27:43

标签: javascript destructuring ecmascript-7

我正在查看node.green并在解构,作业>下嵌套休息,使用以下示例函数:



function f() {
  var a = [1, 2, 3], first, last;
  [first, ...[a[2], last]] = a;
  return first === 1 && last === 3 && (a + "") === "1,2,2";
}

console.log(f())




现在,我理解解构,但我无法弄清楚为什么a被重写为[1, 2, 2]

同样[...[a[2], last]] = a;会返回[1, 2, 1]

2 个答案:

答案 0 :(得分:5)

[first, a[2], last] = a;

就像

// first == undefined,   last == undefined,   a == [1,2,3]
first = a[0];
// first == 1,           last == undefined,   a == [1,2,3]
a[2] = a[1];
// first == 1,           last == undefined,   a == [1,2,2]
last = a[2];
// first == 1,           last == 2,           a == [1,2,2]
[first, ...[a[2], last]] = a;

就像

// first == undefined,   last == undefined,   a == [1,2,3],   tmp == undefined
first = a[0];
// first == 1,           last == undefined,   a == [1,2,3],   tmp == undefined
tmp = [a[1], a[2]];
// first == 1,           last == undefined,   a == [1,2,3],   tmp == [2,3]
a[2] = tmp[0];
// first == 1,           last == undefined,   a == [1,2,2],   tmp == [2,3]
last = tmp[1];
// first == 1,           last == 3,           a == [1,2,2],   tmp == [2,3]
[...[a[2], last]] = a;

就像

// last == undefined,   a == [1,2,3],   tmp == undefined
tmp = [a[0], a[1]];
// last == undefined,   a == [1,2,3],   tmp == [1,2]
a[2] = tmp[0];
// last == undefined,   a == [1,2,1],   tmp == [1,2]
last = tmp[1];
// last == 2,           a == [1,2,1],   tmp == [1,2]

答案 1 :(得分:3)

在第二行中,您将a[2]设置为a的第二个值,即a[1],在这种情况下为2

有趣的是,如果您将[first, ...[a[2], last]]更改为[first, a[2], last],则last会变为2(firsta的最终值与示例中的相同):

var a = [1, 2, 3], first, last;
[first, a[2], last] = a;

console.log(first === 1);
console.log(a + '' === '1,2,2');
console.log(last === 2);

首先为a[2]分配值2,然后为last分配值a[2]。在您的示例中,似乎保留了a的旧值。我怀疑这是因为...创建了一个中间数组,然后将其值分配给a[2]last。希望知道ES6规范深层部分的人可以确认,但可能这是更复杂[first, ...[a[2], last]]的原因。

更新

Bergi在评论中分享了一个规范参考:

  

使用BindingRestElement查看IteratorBindingInitialization。但是,在ES7中使用BindingPattern而不是简单的BindingIdentifier实际上是新的。在ES6中你需要写var [first,... tmp] = a; [a [2],last]] = tmp;这使得发生的事情变得更加清晰。