我有一个对象,由此定义:
var obj = {
'title': 'foo',
'id': '123',
'category': 'aaa',
'meta': 'blah blah'
};
我想将它分配,然而,我在JS中发现了一些我不理解的行为:
var foo = {obj.title: obj.id}; // doesn't work
var bar = {obj['title']: obj['id']}; // this doesn't either
var baz = {}
baz[obj.title] = obj.id // this works fine.
答案 0 :(得分:7)
因为这是ECMAScript 5, Section 11.1.5中定义的方式:
属性名称必须是:
PropertyName : IdentifierName StringLiteral NumericLiteral
obj.title
既不是identifier name,也不是字符串或数字文字。但即使您之前将标题分配给另一个变量,您也会看到生产规则未评估标识符:
生产 PropertyName:IdentifierName 的评估方式如下:
- 返回包含与 IdentifierName 相同字符序列的String值。
醇>
只是详细说明为什么它不是有效的标识符名称:full stop(.
)属于Puncuation, other [Po]类别,它不属于允许的字符。其中包括:
<强> UnicodeLetter 强>: Unicode类别中的任何字符“大写字母(Lu)”,“小写字母 (ll)“,”Titlecase letter(Lt)“,”Modifier letter(Lm)“,”Other letter(Lo)“或”Letter“ 号码(Nl)“。
<强> UnicodeCombiningMark 强>: Unicode类别中的任何字符“非间距标记(Mn)”或“组合 间距标记(Mc)“
<强> UnicodeDigit 强>: Unicode类别“十进制数(Nd)”
中的任何字符<强> UnicodeConnectorPunctuation 强>: Unicode类别“连接器标点符号(Pc)”
中的任何字符