【JS笔记】为什么 !+ ![] + ! + ![]===2 为true呢?

恰饭专用,拼多多优惠券小程序

4919090B26B9398FB501CEDDB451DEBD.jpg

这里涉及到隐式转换和主动转换。

首先拆解

!+![] 和 !+ ![]

先看一个例子,发现[] == ![] 按理说这里是不应该成立的

首先:[] == false , [] 与false 比较 ToNumber后 变成 0 == 0 ,所以 [] == false 成立

然后继续 ![]

由于!显性类型转换的运算规则,先boolean转换再按位取反,![] 进行Boolean([]) 活后 !true == false

于是 ![] == []

image.png

现在看看问题,!+![] 这个的结果是true ,!+ ![] + ! + ![] 等同于 true + true 布尔转换成数字运算 1+ 1=2。

!+![] 这个表达式 先 ![] 等于 false 再!false 等于 true

true + true 进行ToNumber后 1+ 1=2。

还有一个神奇的就是

[‘1’] + [‘2’] = 12 由于[]的valueOf返回的是复杂对象,不是基本类型,于是继续使用对象ToString操作后值为 ‘1’和 ‘2’ 于是 变成了 ‘1’+ ‘2’ , 参与数学+运算中的任一方有包含string的,将会进行字符拼接,但是使用其他的不会 如 - 号 会将字符转换成 数字:[‘1’] - [‘2’]= -1 。

image.png