Является ли это полностью действительным, чтобы иметь функцию javascript как ключ в объекте?

Является ли это полностью действительным, чтобы иметь функцию javascript как ключ в объекте?

Следующие работы, но я не уверен, что это 100% (ecma или какой-либо орган регулирует это) совместимый

var f = function(){

};

var obj = {};

obj[f] = "a";


console.log(obj[f]);

Ответ 1

Для этого нет оснований, поскольку ключи объектов в ECMAscript могут быть только строками (пока что в ECMAscript 262 edition 3 и 5, по спецификации).

Однако в ECMAscript 6 все изменится, где мы будем иметь WeakMaps, а объектные ключи также могут быть объектами (я не уверен в ссылках на функции).

Даже если браузер сейчас может отличить объектные ключи от ссылки на функции, его определенно сомнительное поведение, скорее всего, экспериментальное и не должно использоваться прямо сейчас.

Ответ 2

Похоже, он работает, но он может работать не так, как вы ожидали.

Функция используется для строки при использовании в качестве ключа:

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 являются разными объектами, но они одинаковы при передаче в строку.

Ответ 3

var f = function(){

};
var obj = {};
obj[f] = "a";
console.log(obj['function (){\r\n\r\n}']);