首页 > javascript:null>=0

javascript:null>=0

今天在手机上看到的一个问题,为什么结果是这样?

null==0 //false
null>0 //false
null<0 //false
null>=0 //true

js是遵从ECMAScript规范的,出现上面问题的原因是因为关系运算符会胁迫类型转换。你可以从这里看到ECMA详细的类型转换算法细节,亲:http://bclary.com/2004/11/07/#a-11.9....

首先要明确一点,typeof(null)=='object'。然后问题分两部分回答吧,先说false的三个:

null==0 //false
null>0 //false
null<0 //false

在x与y之间使用= =时,会判断“如果x为object,y为字符串或数字”的情况,这时候会返回ToPrimitive(x) = =y,也就是ToPrimitive(null)==0,null会根据输入的参数0(Number)转换为原始值,这时候是null转化为undefined,>号与<号的转换情况也是一样的,因此出现了false。

undefined==0//false
undefined>0//false
undefined<0//false

true的情况则是null在>=时,通过GetBase和GetPropertyName转换为了0,因此

0>=0//true

这些东西其实挺纠结的说,还是得看ECMAScript的规则。


1. 关系运算符 和 相等运算符 并个类别的

2. 关系运算符,在设计上,总是需要运算元尝试转为一个number . 而相等运算符在设计上,则没有这方面的考虑

3. 最重要的一点, 不要把 拿 a > b , a == b 的结果 想当然的去和 a >= b 建立联系. 正确的符合最初设计思想的关系是 a > b 与 a >= b是一组。a == b 和其他相等运算符才是一组. 比如

a === b , a != b, a !== b
null > 0 //  null 尝试转型为number , 则为0 . 所以结果为 false, 
null >= 0 //  null 尝试转为number ,则为0 , 结果为 true. 
null == 0 // null在设计上,在此处不尝试转型. 所以 结果为false.

参考:http://www.cnblogs.com/_franky/archiv...


null==0 //false [1]
null>0 //false   
null<0 //false
null>=0 //true

JS中 布尔值(true/false),数字,字符串,null、undefined为原始值,其它的都为对象
原始值之间可以做类型的相互转换

原始值 字符串 数字 boolean
undefined “undefined” NaN false
null “null” 0 false
true “true” 1
false “false” 0
“” 0 false
“1.2”(数字字符串) 1.2 true
“one” NaN true
0 “0” false
-0 “0” false
NaN “NaN” false
Infinity “Infinity“ true
-Infinity ”-Infinity” true
1(非0数字) “1” true

这里的比较规则有2种,一般的比较运算和相等运算;2者的比较规则有差别
> < >= <= 为一般比较运算符
== === != 为相等运算符
对于一般比较运算符,要么比较字符串,要么比较数字,但实际上2边操作数可以是任何类型,只要能转换成数字或字符串就可以。
1.2边操作数都为原始值,那么
当2边都是数字时,直接按数字大小比较
当2边都是字符串时,按字符串的大小比较(ASCII字母大小比较)
其余的情况下,将2个操作数都转换为数字后,再进行比较;如果有一个值为NaN,那么结果直接为false
2.当一个操作为为对象时,那么尝试调用对象的valueof方法,看其返回值是否是一个原始值,如果是,那么转换结束,使用这个值进行比较;否则调用toString方法得到字符串后,再进行比较
3.得到原始值后,按1进行比较

相等运算符
如果2个操作数类型相同,那么同===(恒等操作符)比较规则
如果2个操作数类型不同,那么:
1.如果一个值为null,另一个为undefined,则它们相等
2.如果一个为数字,另一个为字符串,那么将字符串转化为数字后,再进行比较
3.如果其中一个值为true,则将其转化为数字1;另一个为false,转化为0,在进行比较
4.如果一个值为对象,另一个为数字或字符串,那么向将对象转换为原始值,先使用valueOf转化为原始值,不能转换为原始值的再尝试使用toString方法转换为原始字符串
5.其它的不同类型的比较就为不相等

null>0 //false   
null<0 //false
null>=0 //true

以上为一般比较运算符,左右2个操作数都为原始值,其中一个值为数字0,那么会将null转换为数字0后执行比较运算,得到的结果如上所示

null==0;//false

执行的时相等比较,1-4个条件都不满足,只有第5个条件可以匹配,故其输出false

【热门文章】
【热门文章】