IE8 和更早版本中的 JScript 解析器遵循旧的 ECMAScript 3.1 (1999) 对象初始值设定项规则,该规则要求如果您想使用保留字(如function
)作为属性名称,它必须用引号引起来。从 ECMAScript5 (2009) 开始,不再需要引号,因为上下文是明确的。自规范更新 (IE9+) 以来发布的 IE 版本确实允许您省略引号。
不同之处在于,在 ECMAscript5 中,对象初始化语法中的PropertyName只是IdentifierName,而不是Identifier。Identifier是不是ReservedWord的IdentifierName。是有效的IdentifierName,但不是有效的Identifier因为它是ReservedWord。更多:标识符名称和标识符。但是旧的规范并没有区分IdentifierName和Identifier,所以要在那里使用,你必须把它放在引号中。function
function
(感谢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
可以通过一个好的优化引擎进行高度优化。所以这种检查方式更难阅读,更长,更不容易打字,而且通常更慢。嗯.... :-)