深度剖析JavaScript中的 == 和 ===

先看如下代码运行结果:

在这里插入图片描述


这是怎么回事呢?

当你通过==比较两个值时,其中一个值可能受到强制转换。
强制 - 自动将值从一种类型转换为另一种类型。
这里的自动是关键词。JavaScript不是在显式转换你的类型,而是在幕后帮你完成。

解释前三个

  1. console.log("1==true 是: ",1==true);//true

看到很多说的类型转化其实有点错误,并不是把1转化成true,而是把true转化成1。
在==的隐式转化中,是对两边进行Number(),Number(true) = 1


  1. console.log("1===true 是: ",1===true);//false

=== 先比较类型,再比较值,也就是===会阻止true隐式转换,true就是Boolean型,不会转化成Number型,结果就是false

  1. 3和4和1,2同理

下面是数组相关(重要)

  1. console.log('0=="0" 是:',0=="0");//true

0是一个数字,然后"0"是一个字符串,它们永远不应该相同的!大多数编程语言都遵守它。例如,Java中的0 == “0”,会返回下面这个:

error: incomparable types: int and String

这很有道理。如果要比较Java中的int和String,必须先把它们转换为相同的类型。

如果你有目的地利用它,这很方便,但如果你不知道它的含义,则可能有害。这是关于它的 官方ECMAScript语言规范(建议用qq浏览器进入官网,qq浏览器自带网页翻译)

If x is Number and y is String, return x == ToNumber(y)

:如果 x 是数字类型,y 是字符串类型,将 y 转换成数字类型与 x 作比较后返回
所以我们的例子0 == “0”:因为 0 是一个数字类型,“0” 是一个字符串类型,则返回 0 == ToNumber(“0”)我们的字符串"0"已经被秘密转换成数字0,所以为true


  1. console.log('0==="0" 是:',0==="0");//false 与 2 同理

  1. console.log("0==[] 是:",0==[]);//true

解释规范相关部分:

If x is String or Number and y is Object, return x == ToPrimitive(y)
译:如果 x 是字符串或数字类型,然后 y 是对象类型,将 y 转换为基本数据类型与 x 作比较后返回

  • 注意数组是对象
  • 再次根据规范,JS首先寻找一个对象的toString方法来强制转换它。在数组的情况下,toString连接其所有元素并将它们作为字符串返回。
[1, 2, 3].toString() // "1,2,3"
['hello', 'world'].toString() // "hello,world"

因为我们的数组是空的,我们没内容去拼接!所以就是返回一个空字符

[].toString() // ""
  • 空字符串然后变成0你不能把这些东西搞定。现在我们已经将数组强制变成"",我们又回到了前面的算法(规范)
If x is Number and y is String, return x == ToNumber(y)

所以0==""

Since 0 is Number and "" is String, return 0 == ToNumber("")

ToNumber("")返回的就是0,也就是0=0 ,所以嘛 0==[ ] 就成立喽!


7.console.log('"0"==[] 是:',"0"==[]); //false 重点

这是正确的

0 == "0" // true

因为被强制转换成这个0 == ToNumber(“0”)。

这也是正确的

0 == [] // true

复制代码因为强制转换执行两次:

  • ToPrimitive([ ])转换为空字符串
  • 然后ToNumber("")转换为 0 。

所以依照上述规则,我们很容易推出以下结论:

"0" == []

嘿嘿!但是很遗憾告诉你这是错误的!

分析:

"0" == [] 

再次参考规范:

If x is String or Number and y is Object, return x == ToPrimitive(y)

那就意味着…

Since "0" is String and [] is Object, return x == ToPrimitive([])
"0" == ""

“0"和” "都是字符串类型,所以JavaScript不需要再强制转换了。 是不是豁然开朗?所以

“0” == [ ] 是 false


总结

都使用三重等号(===),是最好的方法 ^_^

0 === "0" // false
0 === [] // false
"0" === [] // false

它完全避免强制转换

猜你喜欢

转载自blog.csdn.net/haduwi/article/details/105770229