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

时间:2014-10-18 14:34:38

标签: javascript arrays object syntax

> a = ["key","value"]
["key", "value"]
> o = {a[0]:a[1]}
SyntaxError: Unexpected token [

但这没关系

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

浏览器版本:Chrome 37.0.2062.124 m

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

3 个答案:

答案 0 :(得分:5)

根据ECMA Script 5.1 Specification,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

由于[]IdentifierNameStringLiteral中的任何一个都不允许NumericLiteral,因此JavaScript引擎无法解析代码。这就是它给出语法错误的原因。

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

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

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:1)

在ES6中,您有“计算属性名称”(请参阅​​http://www.ecma-international.org/ecma-262/6.0/):

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

这意味着,当您将[Expression]作为关键字而不是StringLiteralNumberLiteralIdentifierName时。表达式被评估并用作密钥。

像这样:

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

但请注意,ES6仍然不受支持。如果不支持此功能,只需在创建对象后分配值(如第二个示例中所示)。