【问题标题】:javascript how initialize object use arrayjavascript如何初始化对象使用数组
【发布时间】:2014-10-18 14:34:38
【问题描述】:
> 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 规范。

【问题讨论】:

    标签: javascript arrays object syntax


    【解决方案1】:

    根据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
    

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

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

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

    【讨论】:

      【解决方案2】:

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

      当您使用方括号语法向现有对象添加属性时,您可以使用可以计算为字符串的表达式(a[0] 会这样做)。

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

      【讨论】:

        【解决方案3】:

        在 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 仍然不受任何地方的支持。如果不支持此功能,只需在创建对象后分配值(如您的第二个示例中)。

        【讨论】:

          猜你喜欢
          • 2020-04-21
          • 2016-03-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-04
          • 1970-01-01
          • 2019-08-28
          相关资源
          最近更新 更多