1、先来看一下几个判断,哪个是false
?
[] == 0
[] == ''
[] == false
![]
首先,我们知道,在js
中只有 0,-0,NaN,"",",null,undefined
这六个值转布尔值时,结果为 false
,那是否意味着上面四个都是false
呢?事实上并不是。
可以看到,只有![]
为false
,这是什么原因呢?
这就要考虑 ==
到底是怎么样做判断的呢?答案是通过隐式转换。那隐式转换的规则又是怎么样的呢?包括以下几种情况:
(1)字符串与数字比较
比如 0 == ''
,这个时候就会把等式右边的字符串进行转换Number('')
,因此相等。
(2)其中一个为引用数据类型
比如 0 == []
,这就涉及到toString
和valueOf
方法了
-
先检测是否有
valueOf
方法,有且返回为原始值则调用valueOf
方法,则对象转为这个原始值。[].valueOf() //[],不是原始值
-
没有
valueOf
方法,或返回的不是原始值,则调用toString
方法,如果有toString
方法且返回的是原始值,则对象转换为这个原始值。[].toString()//"",是原始值
-
如果
valueOf
和toString
方法均没有返回原始值,则抛出TypeError
异常.
经过以上步骤,[]
就转换为了''
,即为情况(1)
(3)其中一个为布尔类型
比如 '' == false
,这个时候会把布尔类型转换为数字类型Number(false)
,即为情况(1)
如果是[] == false
,即判断[] == 0
,即为情况(2)
(4)两个都为引用数据类型
比如[] == [] //false
,因为两个引用数据类型判断的时候是判断他们是否为同一地址
从上面这个例子就可以看出,因为=
赋值操作符为浅拷贝,将b
的值指向了与a
同一地址的内存中,因此a和b
指向的是同一地址。
扩展:有一边为null
或undefined
在==
中null
和undefined
是一回事,可以相互进行隐式强制类型转换。其他值都不存在这种情况
延伸:几种特殊的 ==
[] == ![] //true
因此,[] == ![]
属于情况(2)其中一个为引用数据类型或者情况(3)其中一个为布尔类型。
NaN == NaN //false(0/0 == 0/0同理)
参考文章
[1]https://blog.csdn.net/liuchao1987330/article/details/78789489
[2]https://my.oschina.net/u/1274710/blog/293733
[3]https://www.cnblogs.com/echolun/p/7889848.html