if(xx)和 a==b的判断

作者: 饥人谷_王若曦 | 来源:发表于2018-08-04 23:08 被阅读10次

    一、if(xx)的判断

    对于括号里的表达式,会被强制转换为布尔值。


    原理

    类型 结果
    Undefined false
    Null false
    Boolean 直接判断
    Number +0,-0,0.00,或者NaN为false,其他为true
    String 空字符串为false,其他都为true
    Object true
    1. 当if括号内的表达式为Undefined时,为false。
    if(undefined) {
    console.log("hello")
    } // 不输出
    
    1. 当if括号内的表达式为Null时,为false。
    if(null) {
    console.log("hello")
    } // 不输出
    
    1. 当if括号内的表达式为Boolean时,直接判断。
    if(true) {
    console.log("hello")
    } // hello
    if(false) {
    console.log("hello")
    } // 不输出
    
    1. 当if括号内的表达式为Number时,如果number为+0,-0,0.00或者NaN为false,其他为true。
    if(0.00) {
    console.log("hello")
    } // 不输出
    if(NaN) {
    console.log("hello")
    } // 不输出
    if(1) {
    console.log("hello")
    } // hello
    
    1. 当if括号内的表达式为String时,如果string为空字符串为false,其他为true。
    if("") {
    console.log("hello")
    } // 不输出
    if(" ") {
    console.log("hello")
    } // hello
    
    1. 当if括号内的表达式为Object时,为true。
    if([]) {
    console.log("hello")
    } // hello
    

    二、==的判断

    在js判断两个变量值是否相等,可以使用==相等或===严格相等操作符。
    ==判断两个值是否相等,相同类型直接比较,不同类型需要对类型进行转换再比较。



    解密

    x y 结果
    null undefined true
    number string x == toNumber(y)
    boolean (any) toNumber(x) == y
    object string or number toPrimitive(x)==y
    otherwise otherwise false

    toNumber

    type Result
    undefined NaN
    Null 0
    boolean true->1,false->0
    string "abc"->NaN,"123"->123
    1. null==undefined
      undefined和null与其他类型的值比较时,结果都为false,它们互相比较时结果为true。或undefined/null与对象比较时,对象转为原始值得到undefined,会返回true。
    null == 0 // false
    null == 1 // false
    undefined == 0 // false
    undefined == 1 // false
    null == undefined // true
    
    1. Number==String ---> toNumber(string) == number
    "" == 0 // true,Number("")===0
    " " == 0 // true,Number(" ")===0
    "1"== 1 // true,Number("1")===1
    "hello" == 1 // false,Number("hello")为NaN
    "hello" == 0 // false,Number("hello")为NaN
    !" "==1 // false,
    取反运算符“!”会返回布尔值,且优先级比相等运算符高:空白字符串为true,所以取反的布尔值为false,Number(false)===0
    
    1. Boolean==(any) ---> toNumber(boolean) == (any)
    1 == true // true,Number(true)===1
    0 == false // true,Number(false)===0
    "+0" == true // false,Number("+0")===0,Number(true)===1
    "-0" == true // false,Number("-0")===0,Number(true)===1
    "0.00" == false // true,Number("0.00")===0,Number(false)===0
    
    1. Object==String/Number ---> toPrimitive(object)
      对于 Object (指广义对象,包括数组和函数)类型,先尝试调用 .valueOf 方法获取结果,如果没有定义,再尝试调用 .toString 方法获取结果。
    true == {} // false
    [] == true // false
    var obj = {
      a: 0;
      valueOf: function(){return 1}
    }
    obj == 1 // true,返回值为1
    obj == true // true,Number(true)===1
    obj == "[object object]" // false
    

    相等运算符(==)隐藏的类型转换比较容易出错,所以最好使用严格相等运算符(===)。

    相关文章

      网友评论

        本文标题:if(xx)和 a==b的判断

        本文链接:https://www.haomeiwen.com/subject/iwvocftx.html