2011-11-08 6 views
1

私は、オブジェクトは、このように定義されています: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. 

はなぜ?

+0

「機能しない」とはどういう意味ですか? – geekchic

+0

@geekchic:非常に明白な構文エラーです。 – hugomg

+0

あなたは好きな式を各プロパティの値に入れることができますが、プロパティの名前は文字列、数字、または識別子でなければなりません。 '{'title':anotherobject.property}'は許されますが、 '{anotherobject.property: 'value'}'は許されません。 – nnnnnn

答えて

7

これは、それがECMAScript 5, Section 11.1.5で定義されている方法ですので:

プロパティ名のいずれかでなければなりません:

PropertyName : 
    IdentifierName 
    StringLiteral 
    NumericLiteral 

obj.titleidentifier name、また、文字列や数値リテラルでもありません。

生産PropertyName意味:次のようにIdentifierNameが評価されています

  1. あなたが前に別の変数にタイトルを付けたい場合でもしかし、あなたは生成規則は、識別子を評価していないことを確認しますIdentifierNameと同じ文字シーケンスを含むString値を返します。

ただ、それが有効な識別子名ではありません理由について詳しく説明する:full stop.)が許可される文字の一部ではありませんPuncuation, other [Po]カテゴリに属します。これらは、とりわけ、以下のとおりです。

UnicodeLetter: Unicodeのカテゴリ "大文字(LU)"、 "小文字 (LL)"、 "タイトル文字の手紙(LT)"、「修飾子の任意の文字(Lm)」、「その他の文字(Lo)」、または「 番号(Nl)」のいずれかを入力します。

UnicodeCombiningMark

UnicodeDigit " 間隔マーク(MC)を組み合わせると、" 任意のUnicodeカテゴリ "非スペーシングマーク(Mn)は" 中の文字や: Unicodeのカテゴリ内の任意の文字」進数(Nd)から」

UnicodeConnectorPunctuation: Unicodeのカテゴリ内の任意の文字 "コネクタの句読点(PC)"

+0

+1少し話題にはなりませんが、そこを見ると、識別子名は予約語ではないと述べています。それでも、for文が予約語であっても、 '({for:123})for === 123'は' true'を返します。あなたはおそらく理由を知っていますか? – pimvdb

+0

私は、*識別子*は*識別子名*ですが予約語ではないことを理解しています*。したがって、*識別子名*は任意の有効な文字シーケンスです。 * IdentifierName:IdentifierStart |として定義されています。 IdentifierName IdentifierPart *。 –

+0

詳細な回答ありがとう!私は私の質問が "なぜJSはプロパティ名として文字列に評価するものを使用させていない"と思っていたと思います。 –

関連する問題