Javascript对象字面量不允许引用现有值

Javascript object literals don't allow references to existing values?

本文关键字:引用 不允许 对象 Javascript      更新时间:2023-09-26

我有一个对象,定义如下:

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.
<标题>为什么?

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

属性名必须是:

PropertyName :
    IdentifierName
    StringLiteral
    NumericLiteral

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

生成PropertyName: IdentifierName按如下方式求值:

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

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

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

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

UnicodeDigit :Unicode类别中的任何字符"Decimal number (Nd)"

UnicodeConnectorPunctuation :Unicode类别"连接器标点符号(Pc)"中的任何字符