这是JavaScript object literals中的错误,至少是解析器吗?
////////// a bug in JavaScript? //////////
// works:
const pointless = {
"a b": 1,
"c": 2
};
// works:
({
"a b": 1,
"c": 2
});
// fails when uncommented:
// {
// "a b": 1,
// "c": 2
// };
////////// what lead to the above //////////
// works:
class Thing {
static get table() {
return {
'x': function () { console.log('You chose x!') },
'y': function () { console.log('You chose y!') }
};
}
static doAllTheThings(arg) {
this.table[arg]();
}
}
Thing.doAllTheThings('x');
// works:
function doAllTheThings(arg) {
({
'x': function () { console.log('You chose x!') },
'y': function () { console.log('You chose y!') }
})[arg]();
}
doAllTheThings('y');
// fails when uncommented:
// function doAllTheThings(arg) {
// {
// 'x': function () { console.log('You chose x!') },
// 'y': function () { console.log('You chose y!') }
// }[arg]();
// }
// doAllTheThings('y');

现场演示:https://repl.it/repls/DeadlyFatherlyVertex
我偶然发现了这个尝试制作跳转表而不是使用巨型切换命令。将{}
包裹在()
中,但恕我直言不是必需的。
它有这样的原因吗?
答案 0 :(得分:1)
当您使用()
围绕{}
时,您正在创建一个表达式,该表达式就是对象的评估方式。
但是,您也可以通过简单地使用{}
在JavaScript中创建一个空范围(仍然与周围范围相关联),因此您认为对象的内部实际上被解释为代码,在"a b" : 1,
失败,这是一行无效的代码。
{
console.log(1);
}