Javascript对象文字不允许引用现有值?

Ida*_*zit 1 javascript

我有一个对象,由此定义:

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)

为什么?

Fel*_*ing 7

因为这是在ECMAScript 5第11.1.5节中定义的方式:

属性名称必须是:

PropertyName :
    IdentifierName
    StringLiteral
    NumericLiteral
Run Code Online (Sandbox Code Playgroud)

obj.title既不是标识符名称,也不是字符串或数字文字.但即使您之前将标题分配给另一个变量,您也会看到生产规则不评估标识符:

生产PropertyName:IdentifierName的计算方法如下:

  1. 返回包含与IdentifierName相同的字符序列的String值.

只是详细说明为什么它不是有效的标识符名称:句号(.)属于Puncuation,其他[Po]类别,它不是允许的字符的一部分.其中包括:

UnicodeLetter:Unicode类别中的任何字符"大写字母(Lu)","小写字母(Ll)","标题字母(Lt)","修饰符字母(Lm)","其他字母(Lo)"或"字母编号(Nl)".

UnicodeCombiningMark:Unicode类别中的任何字符"非间距标记(Mn)"或"组合间距标记(Mc)"

UnicodeDigit:Unicode类别中的任何字符"十进制数(Nd)"

UnicodeConnectorPunctuation:Unicode类别中的任何字符"Connector punctuation(Pc)"