「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战」。
前言
在工作中,我们经常用到 “==” 符号来做比较,但是一些前辈会建议我们,在做等值判断的时候,最好是用“===”,其中的原因,你是否有想过呢
if做真值判断
看个栗子
var a = [0];
if ([0]) {
console.log(a == true);
} else {
console.log("wut");
}
先猜下会打印什么出来,“wut”?结果是false
因为在 if语句 中,会先把 括号内的内容强制转换为Boolean ,转换规则如下表
| 转为false的数据 | 转为true的数据 |
|---|---|
| false | true |
| '' | 'string' |
| null | [] |
| undefined | {} |
| NaN | 123 |
也就是说会进入语句 console.log(a == true),且最后将输出false
注意:在进行‘==’比较时,不同类型的数据进行比较时也会有隐形转化。如如果其他类型和数字比较时,会尝试把这个类型转成数字再进行宽松比较,而对象(数组也是对象)会先调用它的toString()方法,此时[0]会变成‘0’,然后将字符串‘0’转成数字0,而0 == true的结果显然是false
概括:有数字转数字。有对象,调toString()
关于“==”
在进行‘==’比较时,不同类型的数据进行比较时会有隐形转化
具体的转换规则为:X == Y
- xy都为Null或undefined,return true;
- x或y为NaN, return false;
- 如果x和y为String,Number,Boolean并且类型不一致,都转为Number再进行比较
- 如果存在Object,会把Object利用valueOf()或者toString()转换为原始值,再比较。js核心内置类,会尝试valueOf先于toString;例外的是Date,Date利用的是toString转换
上述四点中,一二点就不用来讲,现在把第三点存在的情况举例一下:
| 输入 | 输出 |
|---|---|
| Number('123') | 123 |
| Number('') | 0 |
| Number(false) | 0 |
| Number(true) | 1 |
| Number('str') | NaN |
| Number('123str') | NaN |
对象到字符串的转换步骤:
- 如果对象有toString() 方法,javascript调用它。如果返回一个原始值(primitive value如:string number boolean),将这个值转换为字符串作为结果
- 如果对象没有toString() 方法或者返回值不是原始值,javascript寻找对象的valueOf() 方法,如果存在就调用它,返回结果是原始值则转为字符串作为结果
- 否则,javascript不能从toString() 或者valueOf() 获得一个原始值,此时抛出异常
对象到数字的转换步骤:
- 如果对象有valueOf() 方法并且返回元素值,javascript将返回值转换为数字作为结果
- 否则,如果对象有toString() 并且返回原始值,javascript将返回结果转换为数字作为结果
- 否则,抛出异常