のECMAScript 5.1 - セクション11.2.1:次のように
生産MemberExpression : MemberExpression [ Expression ]
が評価されています
- はbaseReferenceがMemberExpressionを評価した結果とします。
- baseValueをGetValue(baseReference)とします。
- PropertyNameReferenceをExpressionを評価した結果とします。
- propertyNameValueをGetValue(propertyNameReference)とします。
- CheckObjectCoercible(baseValue)を呼び出します。
- propertyNameStringをToString(propertyNameValue)にします。
- 評価中の構文プロダクションが厳密なモードコードに含まれている場合はstrictをtrueにし、そうでなければ をfalseにします。
- 基本値が基本値で、参照名が propertyNameStringで、厳密モードフラグがstrictであるReference型の値を返します。
obj[whatever]
を使用するときに、whatever
を文字列に変換されます。関数の場合、これは関数のソースコードを含む文字列になります。
例:
js> var func = function() { return 'hi'; };
js> function helloworld() { return 'hello world'; }
js> var obj = {};
js> obj[func] = 123;
js> obj[helloworld] = 456;
js> obj
({'function() {\n return "hi";\n}':123,
'function helloworld() {\n return "hello world";\n}':456
})
まあは、Chromeで働いていました。だから、SafariとFirefoxでうまくいくかもしれない –
私はそれがあなたに気づくようなものだと思うが、どういうわけかエンジンは文字列としてパースしているので...それはキャストしない限り良い考えではない – Sebas
任意の種類の辞書クラスオブジェクトのキーには、正しく定義された==操作が必要です。このような操作は関数(http://en.wikipedia.org/wiki/Rice%27s_theorem)では定義できません。 –