search

Home  >  Q&A  >  body text

javascript:null>=0

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

null==0 //false
null>0 //false
null<0 //false
null>=0 //true
高洛峰高洛峰2902 days ago624

reply all(3)I'll reply

  • 怪我咯

    怪我咯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的规则。

    reply
    0
  • 阿神

    阿神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...

    reply
    0
  • 大家讲道理

    大家讲道理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

    reply
    0
  • Cancelreply