我有一个对象,由此定义:
var obj = {
'title': 'foo',
'id': '123',
'category': 'aaa',
'meta': 'blah blah'
};
Run Code Online (Sandbox Code Playgroud)
我想把它分配,然而,我在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.
Run Code Online (Sandbox Code Playgroud)
因为这是在ECMAScript 5第11.1.5节中定义的方式:
属性名称必须是:
Run Code Online (Sandbox Code Playgroud)PropertyName : IdentifierName StringLiteral NumericLiteral
obj.title既不是标识符名称,也不是字符串或数字文字.但即使您之前将标题分配给另一个变量,您也会看到生产规则不评估标识符:
生产PropertyName:IdentifierName的计算方法如下:
- 返回包含与IdentifierName相同的字符序列的String值.
只是详细说明为什么它不是有效的标识符名称:句号(.)属于Puncuation,其他[Po]类别,它不是允许的字符的一部分.其中包括:
UnicodeLetter:Unicode类别中的任何字符"大写字母(Lu)","小写字母(Ll)","标题字母(Lt)","修饰符字母(Lm)","其他字母(Lo)"或"字母编号(Nl)".
UnicodeCombiningMark:Unicode类别中的任何字符"非间距标记(Mn)"或"组合间距标记(Mc)"
UnicodeDigit:Unicode类别中的任何字符"十进制数(Nd)"
UnicodeConnectorPunctuation:Unicode类别中的任何字符"Connector punctuation(Pc)"