你能解释一下 JavaScript 表达式:
[1 [{}]]
解析/评估?在 Firefox、Chrome、Konqueror 和 rhino 中,它似乎创建了一个包含单个元素undefined
. 但是,我不明白为什么。
在火狐中:
[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)处,我们返回(数字是对象可强制的)。 propertyNameString = ToString(propertyNameValue)
- 在
ToString
(§9.8),返回ToString(ToPrimitive({}, hint String))
- 在
ToPrimitive
(§9.1)处,返回对象的结果[[DefaultValue]]
,传递PreferredType
(字符串)。 - 在
[[DefaultValue]]
(§8.12.8) 处,让 toString 成为[[Get]]
with argument的结果toString
。 - 这在 §15.2.4.2 中定义为 return
"[object " + [[Class]] + "]"
,其中[[Class]]
“Object”是默认对象原型。 - 由于有一个可调用的
toString
,我们用参数this
来 调用它{}
。 - 返回一个类型的值
Reference
,其基值为BaseValue
(1),其引用名称为propertyNameString
("[object Object]"
)。
然后我们转到数组初始化器(第 11.1.4 节),并用结果构造一个单元素数组。