为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

素胚勾勒不出你 2019-08-26 18:44:53
为什么`null> = 0 && null <= 0`但不是`null == 0`?我必须编写一个例程,如果变量的类型是number,则将变量的值增加1,如果不是,则将变量赋值给0,其中变量最初为null或undefined。第一个实现是v >= 0 ? v += 1 : v = 0因为我认为任何不是数字都会使算术表达式为false,但是由于null >= 0被评估为true ,所以它是错误的。然后我学会了null类似于0的行为,并且以下表达式都被评估为true。null >= 0 && null <= 0!(null < 0 || null > 0)null + 1 === 11 / null === InfinityMath.pow(42, null) === 1当然,null不是0. null == 0被评估为假。这使得看似同义的表达是(v >= 0 && v <= 0) === (v == 0)错误的。为什么它null像0,虽然它实际上不是0?
查看完整描述

4 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

你真正的问题似乎是:

为什么:

null >= 0; // true

但:

null == 0; // false

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

nullEquals Operator==)以特殊方式处理。在简短的,它只强制转换undefined

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

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

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

综上所述:

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

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


查看完整回答
反对 回复 2019-08-26
?
LEATH

TA贡献1936条经验 获得超6个赞

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


null >= 0; //true

null <= 0; //true

null == 0; //false

null > 0;  //false

null < 0;  //false

这没有任何意义。像人类语言一样,这些东西需要用心学习。


查看完整回答
反对 回复 2019-08-26
?
千万里不及你

TA贡献1784条经验 获得超9个赞

我有同样的问题 !!。目前我唯一的解决方案是分开。


var a = null;

var b = undefined;


if (a===0||a>0){ } //return false  !work!

if (b===0||b>0){ } //return false  !work!


//but 

if (a>=0){ } //return true !


查看完整回答
反对 回复 2019-08-26
  • 4 回答
  • 0 关注
  • 1090 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信