Can you explain how the JavaScript expression:
[1 [{}]]
解析/评估?在Firefox、Chrome、Konqueror和rhino中,它似乎创建了一个只有一个元素undefined
的数组。然而,我不明白为什么。
在Firefox中:
[1 [{}]].toSource()
生成
[(void 0)]
用其他JavaScript值替换1似乎会产生相同的结果。
更新:我现在明白了。codeka、Adrian和CMS澄清了事情。就标准而言,我试图浏览ECMAScript 5。
1 [{}]是一个属性访问器,因此它在§11.2.1中得到了覆盖。
baseReference是评估1的结果,因此仍为1。
baseValue = GetValue(baseReference) == 1。
在GetValue(§8.7.1)中,Type(1)不是Reference(已解析的名称绑定),因此返回1。 propertyNameReference是评估{}的结果,因此为空对象。 propertyNameValue = GetValue(propertyNameReference) == {}
在CheckObjectCoercible(§9.10)中,我们返回(数字可强制转换为对象)。 propertyNameString = ToString(propertyNameValue)
在ToString(§9.8)中,返回ToString(ToPrimitive({},hint String))的结果。
在ToPrimitive(§9.1)中,返回对象的[[DefaultValue]]的结果,传递PreferredType(字符串)。
在[[DefaultValue]](§8.12.8)中,让toString成为具有参数toString的[[Get]]的结果。
这在§15.2.4.2中被定义为返回“[object”+[[Class]]+"]",其中[[Class]]是默认对象原型的“Object”。
由于有一个可调用的toString,我们使用参数this为{}调用它。
返回类型为引用的值,其基本值为BaseValue(1),其引用名称为propertyNameString(“[object Object]”)。
然后我们转到数组初始化程序(§11.1.4),并使用结果构造单个元素数组。
[object]
不是一个有效的访问器...所以每个引擎如何处理这种情况仍然取决于它自己。虽然这是一个边缘案例,但我在3.1规范中找不到任何关于应该如何处理它的内容。 - Nick Craver[object]
是有效的,但object
将被转换为字符串。 - Matthew Crumley