计算属性名称上的JS属性访问器在表达式与赋值中的行为不同

时间:2017-09-22 07:30:25

标签: javascript ecmascript-6 syntax-error

如下所示,包含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

1 个答案:

答案 0 :(得分:2)

简而言之,您将大括号记为block statement,而不是object

错误来自label,它不能是computed property name,因为它需要是一个标识符,而不是计算属性。

第一个调用被定义为表达式,在最后一种情况下不是。

为了防止这种情况,您可以将大括号括在表达式的圆括号中。

&#13;
&#13;
eval("var other = 'b'; {a: 1, console.log('block!') };");
console.log(eval("var other = 'b'; ({a: 1, [other]: 2})[other];"));
&#13;
&#13;
&#13;