我必须编写一个例程,如果变量的类型为number
,则该变量的值加1。如果没有,则将 0 赋给变量,其中变量最初为 null
或undefined
.
第一个实现是 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/