将javascript函数作为对象中的键是完全有效的吗?
以下工作,但我不确定它是100%(ecma或任何身体管理此)合规
var f = function(){
};
var obj = {};
obj[f] = "a";
console.log(obj[f]);
Run Code Online (Sandbox Code Playgroud)
看起来它工作,但它可能无法按预期工作.
当用作键时,该函数被转换为字符串:
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是不同的对象,但在转换为字符串时它们是相同的.
这样做的理由是零,因为ECMAscript中的对象键只能是字符串(目前,在ECMAscript 262版本3和5中,按规范)。
但是,情况会发生变化,在ECMAscript 6中,我们将拥有WeakMaps,并且对象键也可以是对象(我不确定函数引用)。
即使浏览器现在可以通过功能引用来区分对象键,其绝对可疑的行为也很可能是实验性的,不应立即使用。
| 归档时间: |
|
| 查看次数: |
3767 次 |
| 最近记录: |