谁能解释这种行为?
对于返回null
值的toString
,是否有不同的处理方法?
let o1 = {
toString: function () {
return 1;
}
};
console.log(o1 == 1); // returns true
console.log(o1.toString() == 1); // returns true
const o2 = {
toString: function () {
return null;
}
};
console.log(o2 == null); // Why this comparison returns false?
console.log(o2.toString() == null); // returns true
祝编码愉快,提前感谢!
这是因为抽象相等比较算法的工作方式。
您需要知道的第一件事是typeof null
是"对象",但是也有Null Type
算法的第一个检查是
- 如果 Type(x) 与 Type(y) 相同,则
现在,我们在左手边有o2
,右手有null
。
Type(o2)
是Object Type
,Type(null)
是Null Type
下面列出了 9 个条件,这两个条件都不适用,算法以最后一步结束。
- 返回假
这意味着,你的toString
函数永远不会真正被调用,你的对象永远不会被强制转换为基元。
您可以通过执行以下操作来验证
var o = {
toString () {
console.log ("toString")
return null;
},
valueOf () {
console.log ("valueOf")
return null
}
}
o == null
不会记录任何内容。
如果您尝试使用>=
和<=
运算符比较它们,您的对象将被强制
o2 <= null && o2 >= null //true
这是完整的算法
- 如果 Type(x) 与 Type(y) 相同,则
a。如果 Type(x) 是"未定义",则返回 true。
二.如果 Type(x) 为 Null,则返回 true。
三.如果 Type(x) 是 Number,则
i。如果 x 是 NaN,则返回 false。
ii. 如果 y 是 NaN,则返回 false。
iii. 如果 x 与 y 的数值相同,则返回 true。
iv. 如果 x 为 +0,y 为 −0,则返回 true。
五.如果 x 为 −0,y 为 +0,则返回 true。
vi. 返回假。
d.如果 Type(x) 是字符串,则如果 x 和 y 是完全相同的字符
序列(相同的长度和相应位置的相同字符),则返回 true
。否则,返回 false。
e.如果 Type(x) 是布尔值,如果 x 和 y 都为真或都为假,则返回 true。否则,返回 false。
f. 如果 x 和 y 引用同一对象,则返回 true。否则,返回 false。- 如果 x 为空且 y 未定义,则返回 true。
- 如果 x 未定义且 y 为空,则返回 true。
- 如果 Type(x) 是 Number 且 Type(y) 是 String,
则返回比较结果 x == ToNumber(y)。- 如果 Type(x) 是字符串,Type(y) 是数字, 返回比较结果 ToNumber(x) == y。
- 如果 Type(x) 是布尔值,则返回比较结果 ToNumber(x) == y。
- 如果 Type(y) 是布尔值,则返回比较结果 x == ToNumber(y)。
- 如果 Type(x) 是字符串或数字,Type(y) 是对象, 返回比较结果 x == ToPrimitive(y)。
- 如果 Type(x) 是对象,Type(y) 是字符串或数字, 返回比较 ToPrimitive(x) == y 的结果。
- 返回假。