如下所示,包含access a property的对象的案例1,案例2和案例3 computed property name。
案例1在函数参数中创建了这样的对象,而案例2在赋值中创建了这样的对象。案例3在声明中创建了这样一个对象。
为什么案例3会产生语法错误?
案例1
$ node -e "var other = 'b'; console.log({a: 1, [other]: 2}[other]);"
2
案例2
$ node -e "var other = 'b'; var obj = {a: 1, [other]: 2}[other]; console.log(obj);"
2
案例3
$ node -e "var other = 'b'; {a: 1, [other]: 2}[other];"
[eval]:1
var other = 'b'; {a: 1, [other]: 2}[other];
^
SyntaxError: Unexpected token :
at createScript (vm.js:56:10)
at Object.runInThisContext (vm.js:97:10)
at Object.<anonymous> ([eval]-wrapper:6:22)
at Module._compile (module.js:570:32)
at evalScript (bootstrap_node.js:353:27)
at run (bootstrap_node.js:122:11)
at run (bootstrap_node.js:389:7)
at startup (bootstrap_node.js:121:9)
at bootstrap_node.js:504:3
节点版本
$ node --version
v6.11.2
答案 0 :(得分:2)
简而言之,您将大括号记为block statement,而不是object。
错误来自label,它不能是computed property name,因为它需要是一个标识符,而不是计算属性。
第一个调用被定义为表达式,在最后一种情况下不是。
为了防止这种情况,您可以将大括号括在表达式的圆括号中。
eval("var other = 'b'; {a: 1, console.log('block!') };");
console.log(eval("var other = 'b'; ({a: 1, [other]: 2})[other];"));
&#13;