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