将javascript函数作为对象中的键是完全有效的吗?

时间:2013-03-05 09:33:49

标签: javascript

将javascript函数作为对象中的键是否完全有效?

以下作品,但我不确定它是100%(ecma或任何身体管理此)合规

var f = function(){

};

var obj = {};

obj[f] = "a";


console.log(obj[f]);

3 个答案:

答案 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}']);