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

时间:2018-01-28 01:00:58

标签: javascript null comparison

任何人都可以解释这种行为吗?

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

快乐编码并提前致谢!

1 个答案:

答案 0 :(得分:2)

这是因为The Abstract Equality Comparison Algorithm的工作原理。

您需要知道的第一件事是typeof null是"对象"但是还有Null Type

算法的第一次检查是

  
      
  1. 如果Type(x)与Type(y)相同,那么
  2.   

现在,左侧有o2,右侧有null

Type(o2)Object TypeType(null)Null Type

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

  
      
  1. 返回false
  2.   

这意味着,您的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)相同,则为
      一个。如果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。
  2.   
  3. 如果x为null且y未定义,则返回true。
  4.   
  5. 如果x未定义且y为null,则返回true。
  6.   
  7. 如果Type(x)是Number而Type(y)是String,则   返回比较结果x == ToNumber(y)。
  8.   
  9. 如果Type(x)是String而Type(y)是Number,   返回比较结果ToNumber(x)== y。
  10.   
  11. 如果Type(x)是布尔值,则返回比较结果ToNumber(x)== y。
  12.   
  13. 如果Type(y)是布尔值,则返回比较结果x == ToNumber(y)。
  14.   
  15. 如果Type(x)是String或Number而Type(y)是Object,   返回比较结果x == ToPrimitive(y)。
  16.   
  17. 如果Type(x)是Object而Type(y)是String或Number,   返回比较结果ToPrimitive(x)== y。
  18.   
  19. 返回false。
  20.