Javascript 节点JS/V8解构错误?

Javascript 节点JS/V8解构错误?,javascript,node.js,ecmascript-6,v8,destructuring,Javascript,Node.js,Ecmascript 6,V8,Destructuring,使用节点8.4.0: $ node > {x, y} = {x: 1, y: 2} { 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 a, b; < unde

使用节点8.4.0:

$ node
> {x, y} = {x: 1, y: 2}
{ 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 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 =
{x,y}={x:1,y:2}
<{x:1,y:2}
>{x,y}={x:1,y:2};
x VM253:1未捕获的语法错误:意外标记=
有人能解释一下吗

澄清 这不是关于let、var或cosnt按预期工作的解构。这是关于先前定义的变量(或非严格模式):从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 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 =
>让a,b;
<未定义
>[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未捕获的语法错误:意外标记=

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

({x, y} = {x: 1, y: 2});
这允许
{x,y}={x:1,y:2}
成为一个表达式。否则,
{x,y}
将被解释为带有逗号运算符的块,这将导致
意外标记=
错误

它在控制台中不使用括号和分号,因为它在控制台中被视为表达式。这和

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

这不是一个bug,而是经过设计的。见“”:

变量可以通过与其声明分离的解构来赋值

var a, b;
({a, b} = {a: 1, b: 2});
当使用不带声明的对象文字解构赋值时,赋值语句周围的
(..)
是必需的语法

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}


当然,您需要一个声明符关键字,如
const
let
var
@Pointy,如果变量以前定义过或未处于严格模式,则该关键字不正确。(我一直使用的是非结构化数组,没有这样的问题),但是添加它确实可以让你总结这个语句。@paul,这肯定不是我要指出的潜在错误。你需要看一看,这解释了无分号的语句是如何得到有效的括号的(根据下面的答案)。