猿问

为什么`null> = 0 && null <= 0`但不是`null == 0`?

为什么`null> = 0 && null <= 0`但不是`null == 0`?

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

第一个实现是v >= 0 ? v += 1 : v = 0因为我认为任何不是数字都会使算术表达式为false,但是由于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被评估为假。这使得看似同义的表达是(v >= 0 && v <= 0) === (v == 0)错误的。

为什么它null像0,虽然它实际上不是0?


素胚勾勒不出你
浏览 1091回答 4
4回答

繁华开满天机

你真正的问题似乎是:为什么:null&nbsp;>=&nbsp;0;&nbsp;//&nbsp;true但:null&nbsp;==&nbsp;0;&nbsp;//&nbsp;false真正发生的是,大于或等于的Operator&nbsp;(>=)执行类型强制(ToPrimitive),具有提示类型Number,实际上所有关系运算符都具有此行为。null由Equals Operator(==)以特殊方式处理。在简短的,它只强制转换到undefined:null&nbsp;==&nbsp;null;&nbsp;//&nbsp;truenull&nbsp;==&nbsp;undefined;&nbsp;//&nbsp;true值,例如false,'','0',和[]受数字类型强制,它们都强迫到零。您可以在抽象等式比较算法和抽象关系比较算法中看到此过程的内部细节。综上所述:关系比较:如果两个值都不是类型String,ToNumber则同时调用它们。这与+在前面添加a相同,对于null强制执行0。平等比较:只调用ToNumber字符串,数字和布尔值。

LEATH

我想扩展这个问题,以进一步提高问题的可见性:null >= 0; //truenull <= 0; //truenull == 0; //falsenull > 0;&nbsp; //falsenull < 0;&nbsp; //false这没有任何意义。像人类语言一样,这些东西需要用心学习。

千万里不及你

我有同样的问题 !!。目前我唯一的解决方案是分开。var a = null;var b = undefined;if (a===0||a>0){ } //return false&nbsp; !work!if (b===0||b>0){ } //return false&nbsp; !work!//but&nbsp;if (a>=0){ } //return true !
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答