彻底弄懂Javascript中的 == 比较

reblogReblogged

这篇文章是我见过那种极其高质量的博文,我个人也喜欢写这样的文章,因为它写得非常细,让你非常易懂,然后也有详细的举例说明,质量非常之高,强推 👍 原文链接我附在文末。

转载这篇文章的原因是,原文是一篇写于2016年的博客园上的博客,但是原文附带的图片都已经显示破碎了,而且网络上一大堆都是抄袭这篇文章却不附带原文链接的小偷文😠,所以我就想把这篇文章重新用自己的话整理一下,并附上原文链接,给大家一个更好的阅读体验,也给自己一个更好的记录。

这里我先把原文中缺失的图片补上:

原文中图1:

image1

原文中图2:

image2

原文中图3:

image3

ok,废话不多说了,我们直接进入正题。

这篇文章的核心我总结一下就是下面的这张图片,我会介绍一下它的用法,让你一看就懂:

image3

这张图要怎么看呢?

你只需要记住以下几点,你就可以完全弄懂Javascript中的 == 比较了:

  • 对象转换成其他的类型,首先要进行Primitive转换,转换成一个基本类型的值。这也是图片中Object处的那个P的含义。

    这个Primitive转换的过程是这样的:如果对象有一个valueOf()方法,并且这个方法返回一个基本类型的值,那么就使用这个值;否则,如果对象有一个toString()方法,并且这个方法返回一个基本类型的值,那么就使用这个值;否则,就会抛出一个错误。

    比如说,当我们进行[] == ''比较的时候,[]会先用valueOf()方法转换成一个基本类型的值,也就是'',所以最终的比较就变成了'' == '',好了,现在它们是同类型的了,所以结果为true

  • 再看其他的,比如我们要将一个Boolean类型和Number进行比较,看图中你可以发现,在Boolean处有一个N,这代表要先把Boolean转换成Number,也就是true转换成1false转换成0,所以当我们进行比较的时候,比如说true == 1,它会先把true转换成1,然后再进行比较,所以结果为true

  • 同样的道理,你看StringNumber之间也有一个N,而且这个N是靠近于String的,说明要由String先开始转换,这代表要先把String转换成Number,比如说当我们进行比较的时候,比如说'1' == 1,它会先把'1'转换成数字1,然后再进行比较,所以结果为true

  • 再看BooleanString之间的关系,它们都各自有一个靠近自己的N,这代表这二者都需要转换成Number类型,进行比较,比如说当我们进行比较的时候,比如说true == '1',js会把true转换成数字1,把'1'转换成数字1,最后进行比较,所以结果为true

  • 最后看一下UndefinedNull之间的关系,这两个都可以理解为:"空",或者说"没有值",所以当我们进行比较的时候,比如说undefined == null,它们会被认为是相等的,所以结果为true

  • 而对于左边的所有类型和右边的所有类型之间的比较,都会被认为是不相等的,(因为非空我们不认为会等于)所以结果为false

好了,至此你已经掌握了js中的==比较的规则了,唯一可能稍微要记忆的地方就是各个对象的valueOf()toString()方法的返回值了,好在对象的类型不多,不算难记忆,其他的都是根据上面这张图就可以完全弄懂了。

你可以随便举一些例子来验证一下,比如说:

[] == '' // true
0 == false // true
'1' == 1 // true
true == '1' // true
undefined == null // true
0 == '' // true
0 == null // false

套用上面的规则,你就可以完全弄懂为什么这些比较的结果是这样的了。

详细的文章可以去看作者的原文,感谢你的阅读!

原文的链接在这里 👉 让你彻底搞懂JS中复杂运算符==