将javascript函数作为对象中的键是否完全有效?
以下作品,但我不确定它是100%(ecma或任何身体管理此)合规
var f = function(){
};
var obj = {};
obj[f] = "a";
console.log(obj[f]);
答案 0 :(得分:9)
它看起来有效,但它可能无法按预期工作。
当用作键时,该函数被转换为字符串:
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是不同的对象,但在转换为字符串时它们是相同的。
答案 1 :(得分:2)
有零这样做的原因,因为ECMAscript中的对象键可能只是字符串(暂时,在ECMAscript 262中)第3版和第5版,按规范)。
然而,在 ECMAscript 6 中,事情会发生变化,我们将拥有 WeakMaps 和对象密钥也可以是对象(我不确定函数引用)。
即使浏览器现在可以通过功能参考区分对象键,它的行为肯定是可疑的,很可能是实验性的,现在不应该使用。
答案 2 :(得分:1)
var f = function(){
};
var obj = {};
obj[f] = "a";
console.log(obj['function (){\r\n\r\n}']);