为什么'null >= 0 && null <= 0'而不是'null == 0'?

2022-08-30 02:21:40

我必须编写一个例程,如果变量的类型是,则将变量的值递增1,如果不是,则将0分配给变量,其中变量最初是或 。numbernullundefined

第一个实现是因为我认为任何不是数字的东西都会使算术表达式出错,但它是错误的,因为它被评估为true。然后我学会了像0这样的行为,下面的表达式都被计算为true。v >= 0 ? v += 1 : v = 0null >= 0null

  • null >= 0 && null <= 0
  • !(null < 0 || null > 0)
  • null + 1 === 1
  • 1 / null === Infinity
  • Math.pow(42, null) === 1

当然,不是0。 被评估为 false。这使得看似重言式的表达是错误的。nullnull == 0(v >= 0 && v <= 0) === (v == 0)

为什么像0一样,尽管它实际上不是0?null


答案 1

你真正的问题似乎是:

为什么:

null >= 0; // true

但:

null == 0; // false

真正发生的事情是大于等于运算符 () 执行类型强制 (ToPrimitive),提示类型为 ,实际上所有关系运算符都有此行为。>=Number

nullEquals 运算符 () 以特殊方式处理。简而言之,它只是强制==undefined

null == null; // true
null == undefined; // true

值(如 、 、 和)受数字类型强制,所有值都强制为零。false'''0'[]

您可以在抽象相等比较算法和抽象关系比较算法中看到此过程的内部细节。

综上所述:

  • 关系比较:如果两个值都不是 String 类型,则在两个值上都调用。这与在前面添加一个相同,对于空强制到 。ToNumber+0

  • 相等比较:仅调用字符串、数字和布尔值。ToNumber


答案 2

我想扩展这个问题,以进一步提高问题的可见性:

null >= 0; //true
null <= 0; //true
null == 0; //false
null > 0;  //false
null < 0;  //false

这毫无意义。就像人类语言一样,这些东西需要用心学习。