我尝试理解文档Ecma-262
的{} == true
部分后面的7.2.12
表达式。
- 如果Type(y)为布尔值,则返回比较结果
醇>x == ToNumber(y)
ToNumber(true)
的结果是1
,然后是
{} == 1
- 如果Type(x)是Object而Type(y)是String,Number或Symbol,那么 返回比较结果
醇>ToPrimitive(x) == y
。
我现在对ToPrimitive({})
感到困惑。
如果提示是“字符串”,那么
一个。让methodNames为«“toString”,“valueOf”»。
- 醇>
否则,
一个。让methodNames为“”valueOf“,”toString“»。
ToPrimitive({})
应该被解释为{}.toString()
还是{}.valueOf()
?
假设调用了toString()
。
如果Type(x)是String而Type(y)是Number, 返回比较结果
ToNumber(x) == y
所以{} == true
可能是ToNumber(ToPrimitive({})) == ToNumber(true)
?
答案 0 :(得分:15)
spec说:
在没有提示的情况下调用
ToPrimitive
时,它通常表现为提示为数字。
因此,根据ToPrimitive
算法,首先调用valueOf
。但是因为它返回一个对象而不是一个原始值,toString
将被调用为second,它将返回一个字符串。
所以
{} == true
可能是ToNumber(ToPrimitive({})) == ToNumber(true)
?
是的,这就是它的本质。
答案 1 :(得分:7)
ToPrimitive({})
首先评估为{}.valueOf()
。由于valueOf()
会返回对象本身,因此会使用toString()
方法
{}.toString()
返回"[object Object]"
,与1
进行比较。 "[object Object]"
转换为NaN
并与1
进行比较
现在操作数与Number类型相同,并使用===运算符。 NaN === 1
评估为false
。
形式上:
{} == true
(将true
转换为Number
- > 1
){} == 1
(使用valueOf()
转换{},然后toString()
- > "[object Object]"
)"[object Object]" == 1
(将"[object Object]"
转换为Number
- > NaN
)NaN == 1
(由于操作数类型相同,将运算符更改为===
)NaN === 1
false
更新:查看我的帖子The legend of JavaScript equality operator,了解更多详情和示例。