首先让我们来看下面的代码:
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
规律总结:
- 在比较前会对
==
两边不同类型的值先进行转换,转换规则如下:
类型 | 转换结果 |
---|---|
Boolean | 转换成数值,ture ==> 1,false ==>0 |
String | 转换成数值"123" ==> 2,"abc" ==> NaN |
Object | 转换为原始类型(PrimitiveValue),即先调用.valueOf ,如果没有定义,在尝试调用.toString 。 |
- 当两边的数值类型相等后,在进行比较。
我们再回来解释开头的例子
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。
网友评论