我尝试理解doc {} == true部分后面的表达式.7.2.12Ecma-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({})首先评估为{}.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 === 1false更新:查看我的帖子JavaScript相等运算符的图例,其中包含更多详细信息和示例.