> 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规范。
答案 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
由于[]
,IdentifierName
和StringLiteral
中的任何一个都不允许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]
作为关键字而不是StringLiteral
,NumberLiteral
或IdentifierName
时。表达式被评估并用作密钥。
像这样:
> a=["key", "value"]
["key", "value"]
> o={[a[0]]: a[1], [3*3]: "hello"}
Object {key: "value", 9: "hello"}
但请注意,ES6仍然不受支持。如果不支持此功能,只需在创建对象后分配值(如第二个示例中所示)。