任何人都可以解释这种行为吗?
对于toString
返回null
值是否存在不同的处理方式?
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
快乐编码并提前致谢!
答案 0 :(得分:2)
这是因为The Abstract Equality Comparison Algorithm的工作原理。
您需要知道的第一件事是typeof null
是"对象"但是还有Null Type
算法的第一次检查是
- 如果Type(x)与Type(y)相同,那么
醇>
现在,左侧有o2
,右侧有null
。
Type(o2)
是Object Type
而Type(null)
是Null Type
下面列出了9个条件,这两个条件都不适用,算法以最后一步结束。
- 返回false
醇>
这意味着,您的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)相同,则为
一个。如果Type(x)为Undefined,则返回true 湾如果Type(x)为Null,则返回true C。如果Type(x)是Number,那么
一世。如果x是NaN,则返回false II。如果y是NaN,则返回false III。如果x与y的数值相同,则返回true IV。如果x为+0且y为-0,则返回true v。如果x是-0且y是+0,则返回true 六。归还假 d。如果Type(x)是String,则如果x和y完全相同则返回true 字符序列(相应的长度和相同的字符 位置)。否则,返回false 即如果Type(x)是布尔值,如果x和y都为true或两者都为false,则返回true。否则,返回false F。如果x和y引用同一个对象,则返回true。否则,返回false。- 如果x为null且y未定义,则返回true。
- 如果x未定义且y为null,则返回true。
- 如果Type(x)是Number而Type(y)是String,则 返回比较结果x == ToNumber(y)。
- 如果Type(x)是String而Type(y)是Number, 返回比较结果ToNumber(x)== y。
- 如果Type(x)是布尔值,则返回比较结果ToNumber(x)== y。
- 如果Type(y)是布尔值,则返回比较结果x == ToNumber(y)。
- 如果Type(x)是String或Number而Type(y)是Object, 返回比较结果x == ToPrimitive(y)。
- 如果Type(x)是Object而Type(y)是String或Number, 返回比较结果ToPrimitive(x)== y。
- 返回false。
醇>