浅谈js中的 “==”

182 阅读2分钟

「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战」。

前言

在工作中,我们经常用到 “==” 符号来做比较,但是一些前辈会建议我们,在做等值判断的时候,最好是用“===”,其中的原因,你是否有想过呢

if做真值判断

看个栗子

var a = [0];
if ([0]) {
  console.log(a == true);
} else {
  console.log("wut");
}

先猜下会打印什么出来,“wut”?结果是false

因为在 if语句 中,会先把 括号内的内容强制转换为Boolean ,转换规则如下表

转为false的数据转为true的数据
falsetrue
'''string'
null[]
undefined{}
NaN123

也就是说会进入语句 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

对象到字符串的转换步骤:

  1. 如果对象有toString() 方法,javascript调用它。如果返回一个原始值(primitive value如:string number boolean),将这个值转换为字符串作为结果
  2. 如果对象没有toString() 方法或者返回值不是原始值,javascript寻找对象的valueOf() 方法,如果存在就调用它,返回结果是原始值则转为字符串作为结果
  3. 否则,javascript不能从toString() 或者valueOf() 获得一个原始值,此时抛出异常

对象到数字的转换步骤:

  1. 如果对象有valueOf() 方法并且返回元素值,javascript将返回值转换为数字作为结果
  2. 否则,如果对象有toString() 并且返回原始值,javascript将返回结果转换为数字作为结果
  3. 否则,抛出异常