最近在面试的过程中,被问到了关于 == 的判断比较,但是由于js的==其实有很多细节,自己又很久没有关注过了,导致并没有答得很好,因此本文就准备记录下关于这个点的东西,废话不多说,开搞!

ppx.jpg

正文

下文中将以相等指代==,全等指代===

由于js一开始只是以一个脚本语言的目标来进行设计的,因此遗留下来了许多在现在看来非常奇怪的特性,相等就是其中之一,根本原因是它会进行 隐式的类型转换,但这个转换规则我个人觉得毫无逻辑,只能死记硬背,因此会造成很大的心智负担

相反的,全等就不会进行类型转换,更加符合我们常识,因此在日常开发中,一定要使用全等,而不是相等,下面分别来看下它俩的用法

qidai.jpeg

全等

上文提到,全等不会进行隐式的类型转换,而是直接进行比较,因此会判断两个方面

只有这两个方面都相等,才能被判为是一样的,全等其实没有太多可讲的,给点具体例子看看就行

1
2
3
4
1 === '1'  //false
true === 1 //false
undefined === null // false
[] === [] //false

相等

相等操作主要就是需要知道它内部的转换规则,具体如下

分两种情况

  1. 两边的类型 相同时,比较的逻辑就跟全等一样

    • 如果类型都是基本类型,则直接比较其值
    • 如果都是引用类型,则比较其引用地址(是否指向同一个对象)
  2. 两边的类型 不相同时

    • 如果有一个操作数是 布尔值,则在比较相等性之前先将其转换成 数值——false转换成0,而true转换成1
    • 如果一个操作数是 字符串,另外一个操作数是 数值,在比较相等性之前先将字符串转换成 数值(用Number()方法)
    • 如果一个操作数是 对象(引用类型),另外一个操作数不是,则调用对象的 valueOf 方法,用得到的原始值按照前面的规则进行比较(如果得到的原始值还是对象,则调用原始值的 toString 方法再进行比较)

另外有几个需要注意的地方: