一尘不染

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

javascript

我必须编写一个例程,如果变量的类型为number,则将变量的值加1,否则将变量的值分配为0,其中变量的初始值为nullundefined

第一个实现是v >= 0 ? v += 1 : v = 0因为我认为没有数字会使算术表达式为假,但是由于null >= 0计算为真,所以这是错误的。然后,我得知null行为类似于0,并且以下表达式均被评估为true。

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

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

为什么null实际上不是0,却像0?


阅读 375

收藏
2020-05-01

共1个答案

一尘不染

您真正的问题似乎是:

为什么:

null >= 0; // true

但:

null == 0; // false

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

null 等于运算符==)以特殊方式处理。在简短的,它只 强制转换undefined

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

值,例如false'''0',和[]被受数字类型强制,它们都强迫到零。

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

综上所述:

  • 关系比较:如果两个值都不是String类型,ToNumber则在两个值上都调用。这与+在前面添加a相同,后者将null强制转换为0

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

2020-05-01