今天在手机上看到的一个问题,为什么结果是这样?
null==0 //false null>0 //false null<0 //false null>=0 //true
怪我咯2017-04-10 12:44:37
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的规则。
阿神2017-04-10 12:44:37
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...
大家讲道理2017-04-10 12:44:37
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