オブジェクトのキーとしてjavascript関数を持つことは完全に有効ですか?
以下は機能しますが、100%(ecmaまたはこれを管理する機関)に準拠しているかどうかはわかりません
var f = function(){
};
var obj = {};
obj[f] = "a";
console.log(obj[f]);
オブジェクトのキーとしてjavascript関数を持つことは完全に有効ですか?
以下は機能しますが、100%(ecmaまたはこれを管理する機関)に準拠しているかどうかはわかりません
var f = function(){
};
var obj = {};
obj[f] = "a";
console.log(obj[f]);
動作しているように見えますが、期待どおりに動作しない可能性があります。
関数をキーとして使用すると、文字列にキャストされます。
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 は異なるオブジェクトですが、文字列にキャストされた場合は同じです。
ECMAscriptのオブジェクト キーは文字列のみである可能性があるため、これを行う理由はありません(当面の間、ECMAscript 262 エディション 3 および 5 では仕様によります)。
ただし、 ECMAscript 6では状況が変わります。ここでは、WeakMapsがあり、オブジェクト キーもオブジェクトにすることができます(関数参照についてはわかりません)。
ブラウザが現在関数参照によってオブジェクト キーを区別できるとしても、その動作は明らかに疑わしく、おそらく実験的なものであり、現在は使用すべきではありません。
var f = function(){
};
var obj = {};
obj[f] = "a";
console.log(obj['function (){\r\n\r\n}']);