你能解释JavaScript表达式如何:JavaScript表达式[1 [{}]]究竟如何解析?
[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(baseValue)
(§9.10),我们返回(Number是对象强制的)。 propertyNameString = ToString(propertyNameValue)
- 在
ToString
(§9.8),返回ToString(ToPrimitive({}, hint String))
- 在
ToPrimitive
(第9.1节),对象的[[DefaultValue]]
的返回结果,通过PreferredType
(串)。 - 在
[[DefaultValue]]
(§8.12.8),令toString为[[Get]]
的结果,其参数toString
。 - 这是在§15.2.4.2定义的,返回
"[object " + [[Class]] + "]"
,其中[[Class]]
是默认对象原型的“Object”。 - 由于有一个可召集的
toString
,我们称它为this
为{}
。 - 返回类型为
Reference
的值,其基值为BaseValue
(1),其参考名称为propertyNameString
("[object Object]"
)。
然后,我们转到数组初始值设定项(第11.1.4节),并用结果构造单个元素数组。
我不知道为什么,这将是有效的JavaScript ...所以你得到发动机*试图*处理它的不可预知的结果。 ..似乎对我来说很正常。 – 2010-06-21 00:24:12
@尼克,我也怀疑它是有效的JS,并且我愿意接受它可能只是未定义的行为。但是,所有4个引擎(它们都有独立的实现)以相同的方式解析它的事实至少是有趣的。 – 2010-06-21 00:31:44
@Matthew - Adrian的回答是对这4个浏览器中行为的一个很好的解释,但我仍然不认为'[object]'是一个有效的访问器,尽管...所以它仍然取决于每个引擎如何会处理这种情况。尽管这是一个边缘案例,我无法在3.1规范中找到任何说明它应该如何处理的内容。 – 2010-06-21 00:55:17