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

Но это нормально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 

Поскольку [] не допускается ни в одном из IdentifierName, StringLiteral и NumericLiteral, двигатель 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/):

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

Что означает, когда вы пишете [Expression] в качестве ключа, вместо StringLiteral, NumberLiteral или IdentifierName. Выражение оценивается и используется вместо этого.

Как это:

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

Однако обратите внимание, что ES6 еще не поддерживается во всем мире. В случае, если эта функция не поддерживается, просто назначьте значения после создания объекта (как в вашем втором примере).