Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么'null>;=0&&;空<;=0`但不是'null==0`?_Javascript_Null_Comparison_Equality - Fatal编程技术网

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
不是0
null==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