【问题标题】:Why after defining a toString function a comparison between objects returns false?为什么在定义一个 toString 函数之后,对象之间的比较返回 false?
【发布时间】:2018-01-28 01:00:58
【问题描述】:

谁能解释这种行为?

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

祝您编码愉快,提前致谢!

【问题讨论】:

  • 你没有覆盖任何类似的东西。 toString 属于原型。
  • o2 == null 返回 false,因为 o2 是一个对象,而 o2.toString() == null 为 true,因为您的函数返回 true
  • @Iwrestledabearonce。感谢您的评论。为什么是假的?
  • toString 只有在需要类型强制时才会被== 调用。由于两个操作数都是对象,所以不需要调用toString,它会比较引用。
  • @4castle 你能和我分享关于你所说的任何文件吗?谢谢!!

标签: javascript null comparison


【解决方案1】:

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

你需要知道的第一件事是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) 相同,则
    一种。如果 Type(x) 未定义,则返回 true。
    湾。如果 Type(x) 为 Null,则返回 true。
    C。如果 Type(x) 是数字,那么
    一世。如果 x 为 NaN,则返回 false。
    ii.如果 y 是 NaN,则返回 false。
    iii.如果 x 与 y 的数值相同,则返回 true。
    iv.如果 x 为 +0 且 y 为 -0,则返回 true。
    v. 如果 x 为 -0 且 y 为 +0,则返回 true。
    六。返回 false。
    d。如果 Type(x) 是字符串,则如果 x 和 y 完全相同,则返回 true
    字符序列(对应的长度相同,字符相同
    职位)。否则,返回 false。
    e.如果 Type(x) 是布尔值,如果 x 和 y 都为真或都为假,则返回真。否则,返回 false。
    F。如果 x 和 y 引用同一个对象,则返回 true。否则,返回假。
  2. 如果 x 为空且 y 未定义,则返回 true。
  3. 如果 x 未定义且 y 为空,则返回 true。
  4. 如果 Type(x) 是数字并且 Type(y) 是字符串,
    返回比较结果 x == ToNumber(y)。
  5. 如果 Type(x) 是字符串并且 Type(y) 是数字, 返回比较结果 ToNumber(x) == y。
  6. 如果 Type(x) 是 Boolean,则返回 ToNumber(x) == y 的比较结果。
  7. 如果 Type(y) 是 Boolean,则返回比较结果 x == ToNumber(y)。
  8. 如果 Type(x) 是 String 或 Number 并且 Type(y) 是 Object, 返回比较结果 x == ToPrimitive(y)。
  9. 如果 Type(x) 是 Object 并且 Type(y) 是字符串或数字, 返回比较 ToPrimitive(x) == y 的结果。
  10. 返回假。

【讨论】:

  • 谢谢分享。这将有助于社区更多地了解 JavaScript 语言。
猜你喜欢
  • 2020-02-11
  • 1970-01-01
  • 2011-04-27
  • 2021-07-23
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
相关资源
最近更新 更多