【发布时间】:2010-06-21 00:20:19
【问题描述】:
你能解释一下JavaScript的表达方式吗:
[1 [{}]]
解析/评估?在 Firefox、Chrome、Konqueror 和 rhino 中,它似乎创建了一个包含单个元素 undefined 的数组。但是,我不明白为什么。
在 Firefox 中:
[1 [{}]].toSource()
生产
[(void 0)]
将 1 替换为其他 JavaScript 值似乎会产生相同的结果。
更新:我想我现在明白了。 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),我们返回(数字是对象强制的)。 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]]是默认对象原型的“对象”。 - 由于有一个可调用的
toString,我们调用它时参数this是{}。 - 返回一个
Reference类型的值,其基值为BaseValue(1),其引用名称为propertyNameString("[object Object]")。
然后我们转到数组初始化器(第 11.1.4 节),并用结果构造一个单元素数组。
【问题讨论】:
-
我不确定为什么这会是有效的 JavaScript...所以您会得到引擎 尝试 处理它的不可预测的结果...对我来说似乎状态正常。
-
@Nick,我也怀疑它是有效的 JS,我愿意接受它只是未定义行为的可能性。然而,所有 4 个引擎(具有单独的实现)以相同的方式解析它的事实至少很有趣。
-
@Matthew - Adrian 的回答很好地解释了这 4 个浏览器中的行为,但我仍然认为
[object]不是有效的访问器......所以它仍然取决于每个引擎将如何处理这种情况。不过,这是一个极端情况,我在 3.1 规范中找不到任何说明应该如何准确处理的内容。 -
@Nick,它似乎至少对 ECMAScript 5 有效。我试着在上面走过。
-
@Nick:
[object]有效,但object将被转换为字符串。
标签: javascript parsing literals