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

Gee*_*Jan 12 javascript

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

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

var f = function(){

};

var obj = {};

obj[f] = "a";


console.log(obj[f]);
Run Code Online (Sandbox Code Playgroud)

SWi*_*ilk 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"
Run Code Online (Sandbox Code Playgroud)

因此,函数f和f2是不同的对象,但在转换为字符串时它们是相同的.

  • 它们可能是封闭的.它们可能具有相同的源代码,可能由相同的外部函数生成,但它们将绑定到闭包中的不同值.所以他们会**表现不同,但看起来一样. (3认同)

jAn*_*ndy 5

这样做的理由是,因为ECMAscript中的对象键只能是字符串(目前,在ECMAscript 262版本3和5中,按规范)。

但是,情况会发生变化,在ECMAscript 6中,我们将拥有WeakMaps,并且对象键也可以是对象(我不确定函数引用)。

即使浏览器现在可以通过功能引用来区分对象键,其绝对可疑的行为也很可能是实验性的,不应立即使用。