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 回答