javascript - 为什么是 `null >= 0 && null <= 0` 而不是 `null == 0` ?

标签 javascript null comparison equality

我必须编写一个例程,如果变量的类型为number,则该变量的值加1。如果没有,则将 0 赋给变量,其中变量最初为 nullundefined .

第一个实现是 v >= 0 ? v += 1 : v = 0因为我认为任何不是数字的东西都会使算术表达式为假,但自从 null >= 0 以来它是错误的被评估为 true。然后我学会了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?

最佳答案

你真正的问题似乎是:

为什么:

null >= 0; // true

但是:

null == 0; // false

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

null等于运算符 (==) 以特殊方式处理。简而言之,它仅强制未定义:

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

false'''0'[] 等值受数字约束类型强制,全部强制为零。

您可以在 The Abstract Equality Comparison Algorithm 中看到这个过程的内部细节。和 The Abstract Relational Comparison Algorithm .

总结:

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

  • 相等比较:仅对字符串、数字和 bool 值调用 ToNumber

关于javascript - 为什么是 `null >= 0 && null <= 0` 而不是 `null == 0` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29519946/

相关文章:

sql-server - MSSQL : alter column not null, 一般

javascript - 如何验证 URL 中的内容 (Javascript)

javascript - knockout 排序方法在 chrome 中不起作用

string - 为什么看似空的文件和字符串会产生 md5sum?

JavaScript:如何将额外参数传递给回调

javascript - Android 手机上的 HTML5 Canvas - 重绘和高亮问题

javascript - 响应式 JS 页面加载到底部而不是顶部

DB2 比较具有非常大的数字的数据

java - 使用 java 根据 LinkedHashMap 中的键与另一个 LinkedHashMap 进行值比较

javascript - JQuery:检查是否使用单选按钮类名称检查了任何单选按钮