== 和 === 有什么区别?
==
用于一般比较,===
用于严格比较,==
在比较的时候可以转换数据类型,===
严格比较,只要类型不匹配就返回flase
。
先来看看 ==
这兄弟:
强制是将值转换为另一种类型的过程。在这种情况下,==
会执行隐式强制。在比较两个值之前,==
需要执行一些规则。
假设我们要比较x == y
的值。
- 如果
x
和y
的类型相同,则 JS 会换成===
操作符进行比较。 - 如果
x
为null
,y
为undefined
,则返回true
。 - 如果
x
为undefined
且y
为null
,则返回true
。 - 如果
x
的类型是number
,y
的类型是string
,那么返回x == toNumber(y)
。 - 如果
x
的类型是string
,y
的类型是number
,那么返回toNumber(x) == y
。 - 如果
x
为类型是boolean
,则返回toNumber(x)== y
。 - 如果
y
为类型是boolean
,则返回x == toNumber(y)
。 - 如果
x
是string
、symbol
或number
,而y
是object
类型,则返回x == toPrimitive(y)
。 - 如果
x
是object
,y
是string
,symbol
则返回toPrimitive(x) == y
。 - 剩下的 返回
false
注意:toPrimitive
首先在对象中使用valueOf
方法,然后使用toString
方法来获取该对象的原始值。
举个例子。
x | y | x == y |
---|---|---|
5 | 5 | true |
1 | ‘1’ | true |
null | undefined | true |
0 | false | true |
‘1,2’ | [1,2] | true |
‘[object Object]’ | {} | true |
这些例子都返回true
。
第一个示例符合条件1
,因为x
和y
具有相同的类型和值。
第二个示例符合条件4
,在比较之前将y
转换为数字。
第三个例子符合条件2
。
第四个例子符合条件7
,因为y
是boolean
类型。
第五个示例符合条件8
。使用toString()
方法将数组转换为字符串,该方法返回1,2
。
最后一个示例符合条件8
。使用toString()
方法将对象转换为字符串,该方法返回[object Object]
。
x | y | x === y |
---|---|---|
5 | 5 | true |
1 | ‘1’ | false |
null | undefined | false |
0 | false | false |
‘1,2’ | [1,2] | false |
‘[object Object]’ | {} | false |
如果使用===
运算符,则第一个示例以外的所有比较将返回false
,因为它们的类型不同,而第一个示例将返回true
,因为两者的类型和值相同。
具体更多规则可以对参考我之前的文章:
我对 JS 中相等和全等操作符转化过程一直很迷惑,直到有了这份算法