Node JS / V8解构bug?

时间:2017-09-07 18:45:01

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

使用节点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 =

任何人都能解释一下吗?

澄清

这不是关于让,var或cosnt解构按预期工作的。这是关于先前定义的变量(或非严格模式):来自chrome console:

> 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 =

2 个答案:

答案 0 :(得分:6)

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

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

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

它在控制台中没有括号和分号,因为它被视为表达式。这与

完全相同
console.log({x, y} = {x: 1, y: 2});

答案 1 :(得分:6)

这不是一个错误,而是设计。请参阅“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}

一样有效