【问题标题】:ES2015+ Nested Rest explanationES2015+ Nested Rest 讲解
【发布时间】:2017-01-09 16:41:47
【问题描述】:

我在查看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]

【问题讨论】:

    标签: javascript destructuring ecmascript-2016


    【解决方案1】:
    [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]
    

    【讨论】:

    • 我猜你在第二个例子中是指tmp = [a[1], a[2]],对吧?扩展运算符具有什么优先级 - 它与括号属性访问器相同吗?
    • @LUH3417 Spread 不是运算符,它是文字语法的一部分 - 就像括号或逗号一样。
    • @LUH3417 是的,谢谢。请参阅 MDN 中的 operator precedence。财产加入发生在传播之前。
    • @Bergi 如果 spread 是一个运算符(f(...args) vs. [...items]),你的意思是它取决于上下文吗?我只是问,因为它经常被称为operator
    【解决方案2】:

    在第二行中,您将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 在 cmets 中分享了一个规范参考:

    请参阅IteratorBindingInitialization,使用 BindingRestElement。然而,使用 BindingPattern 而不是简单的 BindingIdentifier 实际上在 ES7 中是新的。在 ES6 中,您需要编写 var [first, ...tmp] = a; [a[2], 最后一个]] = tmp;这让正在发生的事情更清楚。

    【讨论】:

    • @Bergi 你能分享一个链接吗?
    • IteratorBindingInitializationBindingRestElement。但是,使用BindingPattern 而不是简单的BindingIdentifier 实际上是new in ES7。在 ES6 中,您需要编写 var [first, ...tmp] = a; [a[2], last]] = tmp;,这样可以更清楚地了解正在发生的事情。
    猜你喜欢
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多