2014-10-18 66 views
3
> a = ["key","value"] 
["key", "value"] 
> o = {a[0]:a[1]} 
SyntaxError: Unexpected token [ 

但是,这是OK的JavaScript如何初始化对象使用数组

> o = {} 
Object {} 
> o[a[0]] = a[1]; 
"value" 
> o 
Object {key: "value"} 

浏览器版本:Chrome的37.0.2062.124米

为什么语法错误? 剂量在这里引入一个新的上下文吗?我不熟悉ECMA规范。

回答

5

按照ECMA Script 5.1 Specification,对象文本的定义如下

ObjectLiteral : 
     { } 
     { PropertyNameAndValueList } 
     { PropertyNameAndValueList , } 

PropertyNameAndValueList : 
     PropertyAssignment 
     PropertyNameAndValueList , PropertyAssignment 

PropertyAssignment : 
     PropertyName : AssignmentExpression 
     get PropertyName () { FunctionBody } 
     set PropertyName (PropertySetParameterList) { FunctionBody } 

PropertyName : 
     IdentifierName 
     StringLiteral 
     NumericLiteral 

PropertySetParameterList : 
     Identifier 

由于[]在任何的IdentifierNameStringLiteralNumericLiteral是不允许的,JavaScript引擎是不能够解析代码。这就是它给出语法错误的原因。

因此,实际创建与数组键和值的对象,你需要先单独构建对象,然后分配属性,这样

var newObject = {}; 
newObject[arr[0]] = arr[1]; 
5

在对象文本中,属性名称必须是一个标识符foo字符串文字"foo"),或数字面1)。 a[0]就是这些。

当您使用方括号语法向现有对象添加属性时,则使用可以评估为字符串的表达式(其中a[0])。

如果要使用表达式来设置属性名称,则必须先构造该对象,然后将该属性添加到另一个语句中。

1

在ES6,你有 “计算的属性名称”(见http://www.ecma-international.org/ecma-262/6.0/):

代替 StringLiteralNumberLiteralIdentifierName
PropertyName : See 12.2.6 
    LiteralPropertyName 
    ComputedPropertyName 
LiteralPropertyName : See 12.2.6 
    IdentifierName 
    StringLiteral 
    NumericLiteral 
ComputedPropertyName : See 12.2.6 
    [ AssignmentExpression ] 

这意味着,当你写[Expression]的关键。表达式被评估并用作关键字。

像这样:

> a=["key", "value"] 
["key", "value"] 
> o={[a[0]]: a[1], [3*3]: "hello"} 
Object {key: "value", 9: "hello"} 

不过请注意,这ES6仍然不是随处支持。在不支持此功能的情况下,只需在创建对象后分配值(如第二个示例中所示)。

相关问题