【问题标题】:Node JS / V8 destructuring bug?Node JS / V8 解构错误?
【发布时间】:2018-02-16 14:15:09
【问题描述】:

使用节点 8.4.0:

$ node
> {x, y} = {x: 1, y: 2}
{ x: 1, y: 2 }
>

但是,以下错误也是非交互式的:(唯一的区别是分号)

$ node
> {x, y} = {x: 1, y: 2};
...

也在 Chrome 控制台中:

> {x,y} = {x:1, y:2}
< {x: 1, y: 2}
> {x,y} = {x:1, y:2};
x VM253:1 Uncaught SyntaxError: Unexpected token =

谁能解释一下?

澄清

这与按预期工作的 let、var 或 cosnt 解构无关。这是关于先前定义的变量(或非严格模式):来自 chrome 控制台:

> let a, b;
< undefined
> [a, b] = [1, 2];
< >(2) [1, 2]
> a
< 1
> b
< 2
> {a, b} = {a:3, b:4}
< >{a: 3, b: 4}
> a
< 3
> b
< 4
> {a, b} = {a:3, b:4};
x VM1297:1 Uncaught SyntaxError: Unexpected token =

【问题讨论】:

  • 你肯定需要一个声明符关键字,如@9​​87654326@、letvar
  • @Pointy,如果变量先前已定义或未在严格模式下,则不正确。 (解构数组没有这样的问题,我一直在使用)
  • 但添加它实际上可以让您结束声明。
  • @paul,确定这不是我要指出的潜在错误。
  • 你会想看看Why is {} + {} no longer NaN in Chrome console?,它解释了无分号语句如何获得它们需要变为有效的括号(根据下面的答案)。

标签: javascript node.js ecmascript-6 v8 destructuring


【解决方案1】:

将对象解构为现有变量的正确语法是

({x, y} = {x: 1, y: 2});

这允许{x, y} = {x: 1, y: 2} 成为一个表达式。否则{x, y} 被解释为带有逗号运算符的块,这会导致Unexpected token = 错误。

它在控制台中没有括号和分号的情况下工作,因为它在那里被视为表达式。这实际上与

console.log({x, y} = {x: 1, y: 2});

【讨论】:

    【解决方案2】:

    这不是错误,而是设计使然。见“Assignment without declaration”:

    可以通过与声明分开的解构来为变量赋值。

    var a, b;
    ({a, b} = {a: 1, b: 2});
    

    在使用没有声明的对象字面量解构赋值时,赋值语句周围的( .. ) 是必需的语法。

    {a, b} = {a: 1, b: 2} 不是有效的独立语法,因为左侧的 {a, b} 被视为块而不是对象文字。

    但是,({a, b} = {a: 1, b: 2}) 是有效的,var {a, b} = {a: 1, b: 2} 也是如此

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-22
      • 2016-09-20
      • 1970-01-01
      • 1970-01-01
      • 2021-08-20
      • 1970-01-01
      • 2016-12-18
      相关资源
      最近更新 更多