Javascript 为什么'null>;=0&&;空<;=0`但不是'null==0`?
我必须编写一个例程,如果变量的类型为Javascript 为什么'null>;=0&&;空<;=0`但不是'null==0`?,javascript,null,comparison,equality,Javascript,Null,Comparison,Equality,我必须编写一个例程,如果变量的类型为number,则将变量的值递增1,如果不是,则将变量赋值为0,其中变量最初为null或未定义 第一个实现是v>=0?v+=1:v=0因为我认为任何不是数字的东西都会使算术表达式为假,但这是错误的,因为null>=0的计算结果为真。然后我了解到null的行为类似于0,并且以下表达式的计算结果都为true null>=0&&null 0) null+1===1 1/null==无穷大 Math.pow(42,null)==1 当然,null不是0null==0
number
,则将变量的值递增1,如果不是,则将变量赋值为0,其中变量最初为null
或未定义
第一个实现是v>=0?v+=1:v=0
因为我认为任何不是数字的东西都会使算术表达式为假,但这是错误的,因为null>=0
的计算结果为真。然后我了解到null
的行为类似于0,并且以下表达式的计算结果都为true
null>=0&&null 0)
null+1===1
1/null==无穷大
Math.pow(42,null)==1
当然,
null
不是0null==0
的计算结果为false。这使得看似同义的表达式(v>=0&&v您真正的问题似乎是:
原因:
但是:
实际情况是,大于或等于运算符(=
)执行类型强制(),提示类型为Number
,实际上所有关系运算符都有此行为
null
由Equals运算符(=
)以特殊方式处理。简而言之,它仅强制执行未定义的:
null == null; // true
null == undefined; // true
诸如false
、'
、'0'
和[]
之类的值受到数字类型强制,所有这些值都强制为零
您可以在和中看到此过程的内部详细信息
总之:
- 关系比较:如果两个值都不是字符串类型,则对这两个值都调用
ToNumber
。这与在前面添加一个+
相同,这对于null强制为0
- 相等比较:仅对字符串、数字和布尔值调用
ToNumber
我想扩展这个问题,以进一步提高问题的可视性:
null >= 0; //true
null <= 0; //true
null == 0; //false
null > 0; //false
null < 0; //false
null>=0;//true
null 0;//false
null<0;//false
这毫无意义。就像人类语言一样,这些东西需要用心学习。我也有同样的问题!!。
目前我唯一的解决办法就是分开
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 !
JavaScript既有严格的比较,也有类型转换比较
null>=0;
为真
但是
(null==0)| |(null>0)
为false
null
从数学上讲,这很奇怪。最后一个结果表明“null大于或等于零”,所以在上面的一个比较中,它一定是真的,但它们都是假的
原因是相等检查=
和比较<>==0
为true
,(1)null>0
为false
另一方面,对于未定义的
和空的
的相等性检查==
被定义为,在没有任何转换的情况下,它们彼此相等,不等于任何其他内容。这就是为什么(2)null==0
是false
他说的是Javascript。你的例子是在PHP中。在PHP中操作符==以一种特殊的方式比较值。你可以进行一些非常疯狂的比较,比如“10”==“1e1”(这是真的)。如果使用运算符==,则会得到完全不同的结果,因为它会检查类型是否匹配以及值是否匹配。请查看此链接:PHP“==”运算符确实在“特殊”中工作方法。如果您的要求是从1开始计数,而不是从0开始计数,那么有一种非常简单的方法来递增最初为null
或undefined
的计数器:c=-~c//对于null/undefined,结果为1;对于尚未定义的变量,如果已经有一个数字undefined
是一个变量值,则递增已初始化。null
,另一方面,是一个空的对象值,不应与数字混合。null
不应与数字组合,因此null的行为不应像数字一样。@AtesGoral-简洁,但不明显。值得提醒人们,每当做不明显的事情时,请添加注释解释考虑到代码所做的事情。在大多数情况下,我认为它是一个“过早优化”,因为它为一个微小的性能增益交易明晰。Hi-CMS,根据您的解释,空原语是0,所以0 >=0返回true,并且= =返回错误。但是按照ECMA算法,如果类型(x)是对象和类型(y)如果是字符串或数字,则返回比较结果ToPrimitive(x)==y。在此情况下,它应返回true。请向我解释答案不提供答案-null由Equals运算符(=)以特殊方式处理简言之,它只强制未定义:
-还有什么?你能解释一下,为什么null>=0
?:)@bharathmuppa@andrey deineko:CMS的其余答案在这里:这在第3点中进行了解释。如果两个值都不是字符串类型,则对这两个值都调用ToNumber。这与在前面添加一个+
相同,对于null,它强制执行0
。Equality只在字符串、数字和布尔值上调用ToNumber。描述得很好,但我不喜欢。在任何语言中(x==0 | | x>0)应等同于(x>=0)。javascript是一种愚蠢的语言。它实际上只是规范中的一个bug(因为从数学上讲它是错误的),并且对此无能为力,因为数以百万计的网站依赖于空比较^^ ^’,如上所述,它可以用一个例外来解释,如==如何对待空,否则,在所有情况下,都会使用Number(nulll)将null转换为0,如果(a!=null&&a>=0)
,则更清楚的做法是:。这就澄清了不只是单独执行=
的原因:“a可能为null(或未定义,也就是'==null')”。
null >= 0; //true
null <= 0; //true
null == 0; //false
null > 0; //false
null < 0; //false
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 !
console.log( null > 0 ); // (1) false
console.log( null == 0 ); // (2) false
console.log( null >= 0 ); // (3) true