美文网首页
if(xx)和 比较运算符a==b的ture/false的判断

if(xx)和 比较运算符a==b的ture/false的判断

作者: 荷尔蒙榨汁机 | 来源:发表于2017-12-04 16:18 被阅读0次

    首先让我们来看下面的代码:

    if ([0]) {
      console.log([0] == true);//false
      console.log(!![0]);//true
    }
    
    if ("potato") {
      console.log("potato" == false);//false
      console.log("potato" == true);//false
    }
    

    从上面的两段代码可知,if(条件判断)a == b对ture/false的判断有所不同。下面我们通过范例来进行加深理解。

    if(条件判断)

    Undefined,null

    if(undefined){console.log("true")}; // 无输出
    if(null){console.log("true")};// 无输出
    

    Boolean

    if(true){console.log("true")};// true
    if(false){console.log("true")};// 无输出
    

    Number

    if(0){console.log("true")};// 无输出
    if(NaN){console.log("true")};// 无输出
    if(0.0){console.log("true")};// 无输出
    if(1){console.log("true")};// true
    if(-1){console.log("true")};// true
    

    String

    if(""){console.log("true")};// 无输出
    if(" "){console.log("true")};// true
    if("0"){console.log("true")};// true
    if("false"){console.log("true")};// true
    

    Object

    if({}){console.log("true")};// true
    

    通过上面的例子总结规则如下:

    类型 结果
    Undefined false
    Null false
    Boolean 直接判断
    Number 0,或者NAN为false,其他为true
    String 空字符串为false,其他都为true
    Object true

    比较符表达式

    null == undefined

    console.log(null == undefined);// true
    console.log(undefined == null);// true
    

    Number == String

    console.log(6 == "6");//  true
    console.log(6.1 == "6.1");//  true
    console.log(6 == "six");// false
    

    Boolean == Number/String

    console.log(true == 1);// true
    console.log(false == 0);// true
    console.log(true == "1");//  true
    console.log(false == "0");//  true
    

    Object == Number/String

    fn = new String("2");
    fn == 2; // true
    fn == "2"; // true
    fn == 1; // false
    

    规律总结:

    1. 在比较前会对==两边不同类型的值先进行转换,转换规则如下:
    类型 转换结果
    Boolean 转换成数值,ture ==> 1,false ==>0
    String 转换成数值"123" ==> 2,"abc" ==> NaN
    Object 转换为原始类型(PrimitiveValue),即先调用.valueOf,如果没有定义,在尝试调用.toString
    1. 当两边的数值类型相等后,在进行比较。

    我们再回来解释开头的例子

    if ([0]) {
      console.log([0] == true);//false
      console.log(!![0]);//true
    }
    

    // 由于数组[0]为对象,所以if语句中判定为true。对于[0] == true首先调用[0].valueOf(),由于数组的valueOf()方法返回自身,所以结果不是原始类型,继续调用[0].toString()。对于数组来说,toString()方法的算法,是将每个元素都转为字符串类型,然后用逗号","依次连接起来,所以最终结果是字符串"0",它是一个原始类型的值。
    此时,表达式变为:
    "0" == true
    两个操作数变成了字符串类型、布尔类型。根据前面总结的规律,进行转换,"0"转换为数值0,true转换为数值1。表达式变为:
    0 == 1
    到此为止,结果为false。

    if ("potato") {
      console.log("potato" == false);//false
      console.log("potato" == true);//false
    }
    

    // potato在if语句中为字符串,所以判定为true。再来看表达式"potato" == false",先类型转换,"potato"字符串类型转换为NaN,false转换为0,所以结果为false。

    相关文章

      网友评论

          本文标题:if(xx)和 比较运算符a==b的ture/false的判断

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