==中的隐式转换

1、先来看一下几个判断,哪个是false?

  • [] == 0
  • [] == ''
  • [] == false
  • ![]

首先,我们知道,在js中只有 0,-0,NaN,"",",null,undefined 这六个值转布尔值时,结果为 false,那是否意味着上面四个都是false呢?事实上并不是。
在这里插入图片描述
可以看到,只有![]false,这是什么原因呢?
这就要考虑 == 到底是怎么样做判断的呢?答案是通过隐式转换。那隐式转换的规则又是怎么样的呢?包括以下几种情况:

(1)字符串与数字比较
比如 0 == '',这个时候就会把等式右边的字符串进行转换Number(''),因此相等。

(2)其中一个为引用数据类型
比如 0 == [],这就涉及到toStringvalueOf方法了

  • 先检测是否有valueOf方法,有且返回为原始值则调用valueOf方法,则对象转为这个原始值。[].valueOf() //[],不是原始值

  • 没有valueOf方法,或返回的不是原始值,则调用toString方法,如果有toString方法且返回的是原始值,则对象转换为这个原始值。[].toString()//"",是原始值

  • 如果valueOftoString方法均没有返回原始值,则抛出TypeError异常.

经过以上步骤,[]就转换为了'',即为情况(1)

(3)其中一个为布尔类型
比如 '' == false,这个时候会把布尔类型转换为数字类型Number(false),即为情况(1)
如果是[] == false,即判断[] == 0,即为情况(2)

(4)两个都为引用数据类型
比如[] == [] //false,因为两个引用数据类型判断的时候是判断他们是否为同一地址
在这里插入图片描述
从上面这个例子就可以看出,因为=赋值操作符为浅拷贝,将b的值指向了与a同一地址的内存中,因此a和b指向的是同一地址。

扩展:有一边为nullundefined
==nullundefined 是一回事,可以相互进行隐式强制类型转换。其他值都不存在这种情况
在这里插入图片描述
延伸:几种特殊的 ==
[] == ![] //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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值