IE8 和更早版本中的 JScript 解析器遵循旧的 ECMAScript 3.1 (1999) 对象初始值设定项规则,该规则要求如果您想使用保留字(如function)作为属性名称,它必须用引号引起来。从 ECMAScript5 (2009) 开始,不再需要引号,因为上下文是明确的。自规范更新 (IE9+) 以来发布的 IE 版本确实允许您省略引号。
不同之处在于,在 ECMAscript5 中,对象初始化语法中的PropertyName只是IdentifierName,而不是Identifier。Identifier是不是ReservedWord的IdentifierName。是有效的IdentifierName,但不是有效的Identifier因为它是ReservedWord。更多:标识符名称和标识符。但是旧的规范并没有区分IdentifierName和Identifier,所以要在那里使用,你必须把它放在引号中。functionfunction(感谢chuckj提醒我这在ECMAScript5 中发生了变化。)
另外,有人可以解释为什么这个“确实”在 Firefox 中有效,或者我的意思是这个表达对我来说很奇怪......
是的,这很奇怪,任何使用它编写代码的人都可能会偶然发现它。这是一种简短的写作方式(typeof somefunc=="function")。这是正在发生的事情:
该表达式创建一个具有一个属性的对象,在这种情况下,属性名称为function,值为1。
该typeof somefunc部分"function"针对 JavaScript 函数、"object"各种对象、"number"数字原语、"string"字符串原语等进行评估并返回。
该属性名称用于在步骤 1 中创建的对象上查找属性。如果找到该属性,则表达式的总体结果是1,一个真值。如果未找到该属性,则总体结果为undefined,一个虚假值。
所以({function:1}[typeof somefunc])测试是否typeof返回"function". 同样,somefunc您可以({object:1}[typeof someobj])检查是否typeof返回"object",someobj或({string:1}[typeof somestring])检查是否typeof返回"string"。somestring
旁注:与直截了当的测试相比,这种晦涩难懂的测试方式根本(typeof somefunc=="function")表现不佳:测试为真| 测试为假不足为奇,因为它typeof x == y可以通过一个好的优化引擎进行高度优化。所以这种检查方式更难阅读,更长,更不容易打字,而且通常更慢。嗯.... :-)