將javascript函數作爲對象中的鍵是完全有效的嗎?在對象中有一個javascript函數作爲鍵是完全有效的嗎?
下工作,但我不知道它的100%(ECMA或任何身體管轄本)兼容
var f = function(){
};
var obj = {};
obj[f] = "a";
console.log(obj[f]);
將javascript函數作爲對象中的鍵是完全有效的嗎?在對象中有一個javascript函數作爲鍵是完全有效的嗎?
下工作,但我不知道它的100%(ECMA或任何身體管轄本)兼容
var f = function(){
};
var obj = {};
obj[f] = "a";
console.log(obj[f]);
有零理由這樣做,因爲對象鍵在ECMAscript中可能只有是字符串(目前,在ECMAscript 262第3版和第5版中,按規格)。
事情會然而,在的EcmaScript 6改變,在那裏我們將有WeakMaps和對象鍵也可以對象(我不知道函數引用)。
即使瀏覽器可以通過功能參考現在區分對象鍵,它肯定是有問題的行爲,最有可能的實驗,不應該馬上使用。
它看起來像工作,但它可能無法按預期工作。作爲密鑰使用時
功能澆鑄到字符串:
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 1和f 2是不同的對象,但它們是相同的,當澆鑄字符串。
雖然如果'f'和'f2'表現相同,因爲底層代碼是相同的,那麼它通常不是問題。 – 2015-01-21 10:53:46
這可能是因爲他們是封閉的。它們可能具有相同的源代碼,可能由相同的外部函數生成,但它們將在閉包中綁定到不同的值。所以他們會**表現不同,但看起來一樣。 – SWilk 2015-02-20 09:27:53
var f = function(){
};
var obj = {};
obj[f] = "a";
console.log(obj['function(){\r\n\r\n}']);
我很好奇爲此看到一個實際的用例。 – 2013-03-05 09:35:29
我會說這是毫無意義的。該函數很可能使用toString創建一個鍵['「function(){...}」]' – mplungjan 2013-03-05 09:38:54
在發佈/子系統中跟蹤/註銷匿名用戶函數。不知道這是適合這份工作的數據結構,雖然 – 2013-03-05 09:40:15