6

JavaScript の式:

[1 [{}]]

解析/評価しますか? Firefox、Chrome、Konqueror、および rhino では、単一の要素を持つ配列を作成するようundefinedです。しかし、私はその理由を理解していません。

Firefox の場合:

[1 [{}]].toSource()

生産する

[(void 0)]

1 を他の JavaScript 値に置き換えても、同じ結果になるようです。

更新:私は今理解していると思います。codeka、Adrian、および CMS が明確化しました。標準に関しては、ECMAScript 5 について説明しようとしました。

  1. 1 [{}]はプロパティ アクセサーであるため、§11.2.1 で説明されています。
  2. baseReference評価の結果な1ので、まだ1です。
  3. baseValue = GetValue(baseReference) == 1.
  4. GetValue(§8.7.1) では、(解決された名前バインディング) でType(1)はないので、1 を返します。Reference
  5. propertyNameReferenceは を評価{}した結果なので、空のオブジェクトです。
  6. propertyNameValue = GetValue(propertyNameReference) == {}
  7. ( §9.10 CheckObjectCoercible(baseValue)) で、(Number is object-coercible) を返します。
  8. propertyNameString = ToString(propertyNameValue)
  9. ( §9.8 ToString) で、戻るToString(ToPrimitive({}, hint String))
  10. ( §9.1 ) で、(文字列)を渡してToPrimitive、オブジェクトの の結果を返します。[[DefaultValue]]PreferredType
  11. ( §8.12.8 [[DefaultValue]]) で、 toString を[[Get]]with argumentの結果としますtoString
  12. これは、§15.2.4.2 で return に定義されています。"[object " + [[Class]] + "]"ここで[[Class]]、 はデフォルト オブジェクト プロトタイプの "Object" です。
  13. callable があるのでtoString、引数を にして呼び出しthisます {}
  14. Reference基本値がBaseValue(1) で参照名がpropertyNameString( )の type の値を返します"[object Object]"

次に、配列初期化子 (§11.1.4) に進み、結果を使用して単一の要素配列を構築します。

4

3 に答える 3

15

OPとニックのコメントを読んで、エイドリアンの答えをもう少し広げて、より明確にすることができると思います。

これは完全に有効な JavaScript です。

JavaScript はオブジェクトのプロパティ名を文字列として扱います。オブジェクトには他の型や他のオブジェクトをキーとして含めることはできません。それらは単なる文字列です。

ブラケット記法プロパティ アクセサー( MemberExpression [ Expression ]) は、ブラケット間の式を暗黙的に文字列に変換するため、次のようになります。

var obj = {};
obj[{}] = "foo";
alert(obj["[object Object]"]); // foo

{}上記の例では、プロパティに値を代入し、{}.toString()(または{}+'') 文字列"[object Object]を ( 経由で) 生成していることがわかりますObject.prototype.toString

この式1 [{}]は暗黙的に 1Numberプリミティブをオブジェクトに変換し (これはプロパティ アクセサーによって作成されます)、プロパティ ルックアップという名前"[object Object]"のプロパティをルックアップしNumber.prototypeObject.prototypeオブジェクトに対して行われます。次に例を示します。

1['toString'] === Number.prototype.toString; // true

最後に、1 [{}]式自体が角かっこ ( [1 [{}]]) で囲まれています。これは実際には配列リテラルです。

結論として、パーサーが式を評価する方法は次のとおりです。

 [1 [{}]];
 //   ^ The accessor expression is evaluated and converted to string

 [1 ["[object Object]"]];
 // ^ A property lookup is made on an Number object 
 //   trying to access a property named "[object Object]"

 [undefined];
 //   ^ the property is obviously not found

   [undefined];
 //^         ^
 // An array literal is created with an element `0` which its value is `undefined`
于 2010-06-21T01:08:46.443 に答える
8

{}これは、オブジェクトのプロパティを取得1して配列に配置しようとしているためです。にはプロパティがあり1ません。{}1[{}]undefined

を配列に置き換える1と、それがどのように機能するかがわかります。1asとas[5]で、それはです。{}0[[5][0]]

また、obj['property']と同じであることに注意してobj.propertyください。

于 2010-06-21T00:41:38.633 に答える
7

少し分解すると、次のことがわかります。

var foo = 1;
var bar = {};
var baz = foo[bar];

[baz];

有効な JavaScript だと思いますが、私は専門家ではありません...

于 2010-06-21T00:41:18.630 に答える