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

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

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的判断)