javascript如何初始化对象使用数组

wen*_*ner 3 javascript arrays syntax object

> a = ["key","value"]
["key", "value"]
> o = {a[0]:a[1]}
SyntaxError: Unexpected token [
Run Code Online (Sandbox Code Playgroud)

但这没关系

> o = {}
Object {}
> o[a[0]] = a[1];
"value"
> o
Object {key: "value"}
Run Code Online (Sandbox Code Playgroud)

浏览器版本:Chrome 37.0.2062.124 m

为什么语法错误?剂量在这里介绍一个新的背景?我不熟悉ECMA规范.

the*_*eye 5

根据ECMA Script 5.1规范,Object Literal定义如下

ObjectLiteral :
        { }
        { PropertyNameAndValueList }
        { PropertyNameAndValueList , }

PropertyNameAndValueList :
        PropertyAssignment
        PropertyNameAndValueList , PropertyAssignment

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

PropertyName :
        IdentifierName
        StringLiteral
        NumericLiteral

PropertySetParameterList :
        Identifier
Run Code Online (Sandbox Code Playgroud)

由于[]不允许任何IdentifierName,StringLiteral并且NumericLiteral,JavaScript引擎无法解析代码.这就是它给出语法错误的原因.

因此,要实际使用数组中的键和值创建Object,您需要先构造Object,然后单独分配属性,如下所示

var newObject = {};
newObject[arr[0]] = arr[1];
Run Code Online (Sandbox Code Playgroud)


Que*_*tin 5

在对象文字中,属性名称必须是identifier(foo),string literal("foo")或number literal(1).a[0]不是这些.

使用方括号语法向现有对象添加属性时,可以使用可以计算为字符串的表达式(a[0]确实如此).

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