为什么在定义 toString 函数后,对象之间的比较返回 false?



谁能解释这种行为?

对于返回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

算法的第一个检查是

  1. 如果 Type(x) 与 Type(y) 相同,则

现在,我们在左手边有o2,右手有null

Type(o2)Object TypeType(null)Null Type

下面列出了 9 个条件,这两个条件都不适用,算法以最后一步结束。

  1. 返回假

这意味着,你的toString函数永远不会真正被调用,你的对象永远不会被强制转换为基元。

您可以通过执行以下操作来验证

var o = {
toString () {
console.log ("toString")
return null;
}, 
valueOf () {
console.log ("valueOf")
return null
}
}
o == null

不会记录任何内容。

如果您尝试使用>=<=运算符比较它们,您的对象将被强制

o2 <= null && o2 >= null //true

这是完整的算法

  1. 如果 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。
  2. 如果 x 为空且 y 未定义,则返回 true。
  3. 如果 x 未定义且 y 为空,则返回 true。
  4. 如果 Type(x) 是 Number 且 Type(y) 是 String,
    则返回比较结果 x == ToNumber(y)。
  5. 如果 Type(x) 是字符串,Type(y) 是数字, 返回比较结果 ToNumber(x) == y。
  6. 如果 Type(x) 是布尔值,则返回比较结果 ToNumber(x) == y。
  7. 如果 Type(y) 是布尔值,则返回比较结果 x == ToNumber(y)。
  8. 如果 Type(x) 是字符串或数字,Type(y) 是对象, 返回比较结果 x == ToPrimitive(y)。
  9. 如果 Type(x) 是对象,Type(y) 是字符串或数字, 返回比较 ToPrimitive(x) == y 的结果。
  10. 返回假。

相关内容

  • 没有找到相关文章

最新更新