函数是javascript对象属性的有效键吗?

时间:2012-06-01 23:46:49

标签: javascript

我想在javascript对象中使用函数作为键。以下工作,至少在Chrome中:

var registry = {};
function Foo(){  };
function Bar(){  };
registry[Foo] = 42;
registry[Bar] = 43;
alert(registry[Foo] + " < " + registry[Bar]);

这是否符合标准?它支持哪些浏览器?

2 个答案:

答案 0 :(得分:15)

你放在方括号之间的所有东西都被转换成一个字符串,即使你放了一个函数,一个日期,一个正则表达式就会发生这种情况......所以,你实际上是在创建一个像这样的对象:

var registry = {
    "function Foo(){  }" : 42,
    "function Bar(){  }" : 43
};

这是一种默认行为,如果您想知道它也适用于IE。它实际上是由John Resig在他的famous addEvent function中利用的。

答案 1 :(得分:6)

  

ECMAScript 5.1 - 第11.2.1节:

     

生产MemberExpression : MemberExpression [ Expression ]的评估如下:

     
      
  1. 让baseReference成为评估MemberExpression的结果。
  2.   
  3. 让baseValue为GetValue(baseReference)。
  4.   
  5. 让propertyNameReference成为评估Expression的结果。
  6.   
  7. 让propertyNameValue为GetValue(propertyNameReference)。
  8.   
  9. 调用CheckObjectCoercible(baseValue)。
  10.   
  11. 让propertyNameString为ToString(propertyNameValue)。
  12.   
  13. 如果正在评估的语法生成包含在严格模式代码中,则let strict为true,否则为let    严格要假。
  14.   
  15. 返回类型为Reference的值,其基值为基值,其引用名称为   propertyNameString,其严格模式标志是严格的。
  16.   

因此,当使用obj[whatever]时,whatever将转换为字符串。对于函数,这将是一个包含函数源代码的字符串。

示例:

js> var func = function() { return 'hi'; };
js> function helloworld() { return 'hello world'; }
js> var obj = {};
js> obj[func] = 123;
js> obj[helloworld] = 456;
js> obj
({'function () {\n    return "hi";\n}':123,
  'function helloworld() {\n    return "hello world";\n}':456
})