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

时间:2011-11-08 12:18:34

标签: javascript

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

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.

为什么?

1 个答案:

答案 0 :(得分:7)

因为这是ECMAScript 5, Section 11.1.5中定义的方式:

属性名称必须是:

PropertyName :
    IdentifierName
    StringLiteral
    NumericLiteral

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

  

生产 PropertyName:IdentifierName 的评估方式如下:

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

只是详细说明为什么它不是有效的标识符名称: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)”

中的任何字符