我尝试理解doc {} == true
部分后面的表达式.7.2.12
Ecma-262
如果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)
吗?
该规范说:
在
ToPrimitive
没有提示的情况下调用时,它通常表现为提示为数字.
因此,根据ToPrimitive
算法,valueOf
首先调用.但由于返回一个对象而不是原始值,toString
因此将调用second,它返回一个字符串.
那
{} == true
可能是ToNumber(ToPrimitive({})) == ToNumber(true)
吗?
是的,这正是它的本质.
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
更新:查看我的帖子JavaScript相等运算符的图例,其中包含更多详细信息和示例.