为什么在声明的对象上解构 ES6 会出现问题?

Why there is a problem with destructuring ES6 on declared object?

我有一个问题,或者更奇怪的情况。我正在使用 https://es6console.com.

我想使用解构并将属性分配给已声明的变量。看起来我声明对象的地方有问题。请打开 https://es6console.com/jm6e72c7/ 并点击转换为 ES5。我在变量后声明对象时有一种奇怪的行为。

// not working
let ip, port;

let config = {
    ip: 'ip',
    port: 'port'
}

({ip, port} = config)

console.log(ip);

//working
let obj = {
    name: 'name',
    age: 'age'
}

let name, age;

({name, age} = obj)

console.log(name);

这是必须使用分号的情况之一:

let ip, port;

let config = {
 ip: 'ip',
 port: 'port'
};  //< --- you need the ;

({ip, port} = config)

console.log(ip);

否则javascript会将代码解释为:

let config = {ip: 'ip',port: 'port'}() which is a type error because it tries to call a function.

首先,它们都有效。将 ES6 代码编译为 ES5 有两种不同的方法:

({ip, port} = config)
// converted to
((_config = config, ip = _config.ip, port = _config.port, _config));

// and

({name, age} = obj)
// converted to
name = obj.name;
age = obj.age;

在这两种情况下,结果都是将变量设置为对象中的适当值。

不同之处在于,编译器认为赋值操作的 return 值在第一种情况下可能很重要,但在第二种情况下则不会。因此,在第一种情况下,您会在末尾看到 _config 作为 return 值。实际上不需要,但转译器是防御性的——它会尽最大努力确保功能完全相同。

至于为什么它认为你可能想要第一种情况下的return值,这是因为[的声明后缺少分号=13=]对象。

添加分号后,它按预期工作:

let config = {
    ip: 'ip',
    port: 'port'
};

({ip, port} = config)

Working example

问题是缺少分号。

let ip, port;

let config = {
 ip: 'ip',
 port: 'port'
}

({ip, port} = config)//this is being evaluated as part of the let config declaration...

console.log(ip);
console.log('------------------------------');

let obj = {
 name: 'name',
 age: 'age'
}

let name, age;

({name, age} = obj)

console.log(name);

需要

let ip, port;

let config = {
 ip: 'ip',
 port: 'port'
};//added semicolon here

({ip, port} = config);//not needed here, but good to have

console.log(ip);
console.log('------------------------------');

let obj = {
 name: 'name',
 age: 'age'
}

let name, age;

({name, age} = obj)

console.log(name);

您会注意到,即使 运行 为 es6,您也会在第一个代码片段中遇到解构错误。这是因为解释器将语句读为

let ip, port;
let config = {ip:'ip',port:'port'}({ip, port} = config)