16

オブジェクトのキーとしてjavascript関数を持つことは完全に有効ですか?

以下は機能しますが、100%(ecmaまたはこれを管理する機関)に準拠しているかどうかはわかりません

var f = function(){

};

var obj = {};

obj[f] = "a";


console.log(obj[f]);
4

3 に答える 3

13

動作しているように見えますが、期待どおりに動作しない可能性があります。

関数をキーとして使用すると、文字列にキャストされます。

var f = function(a) { return a; };
var obj = {};
obj[f] = 'abc';
console.log(JSON.stringify(obj));
//"{"function (a) { return a; }":"abc"}"
console.log(f.toString());
//"function (a) { return a; }"
var f2 = function (a) { return a; };
console.log(obj[f2]);
//"abc"

したがって、関数 f と f2 は異なるオブジェクトですが、文字列にキャストされた場合は同じです。

于 2013-03-05T09:42:12.977 に答える
7

ECMAscriptのオブジェクト キーは文字列のみである可能性があるため、これを行う理由はありません(当面の間、ECMAscript 262 エディション 3 および 5 では仕様によります)。

ただし、 ECMAscript 6では状況が変わります。ここでは、WeakMapsがあり、オブジェクト キーもオブジェクトにすることができます(関数参照についてはわかりません)。

ブラウザが現在関数参照によってオブジェクト キーを区別できるとしても、その動作は明らかに疑わしく、おそらく実験的なものであり、現在は使用すべきではありません。

于 2013-03-05T09:41:59.723 に答える
1
var f = function(){

};
var obj = {};
obj[f] = "a";
console.log(obj['function (){\r\n\r\n}']);
于 2013-03-05T09:48:39.233 に答える