当有一个这样的表达式。
if(false){}
JS在解析这个表达式时,会先将布尔值false转换成数据类型0,然后在执行。明白这一点就好搞了,今天我们要聊的就是JS中隐式类型转换的问题。
先来一起看一下下面这些表达式,是否都能理解。
如果你对上面这些表达式的输出还有一些疑虑,那么今天看完篇文章也许你就会明白这其中的原由了。
讲解一个例子:
一、[]和false怎么比较相等与不相等?
这两个中,一个是对象,一个是布尔值,按原则,类型不同时,需要转换再比较。
然而,在JS中规定如果有布尔值时,只能转换成数字进行比较。(有同学可能会问,为什么不转成字符串来进行比较,转成字符串就是'false'/'true',比较就没什么意义了 )
所以上面比较表达式就变成了[]和0的比较。
二、[]和0怎么比较相等与不相等?
在原值和非原值进行比较的时候,需要把非原值转换成原值才可以进行比较。
而你可以认为在JS中每一个对象都有一个方法toString,用这个方法可以将对象转成可比较的原值。
先来做实验:
从上面的运行结果可以看出,数组的toString方法相当于就是join方法。
所以接下来的问题就是怎么比较‘’和0。
三、‘’和0怎么比较相等和不相等
然而,这是一个字符串和数字的比较,会先把字符串转换成数字再来进行下一步。
使用的方法是Number,来做个实验:
可能有同学会有疑问,为什么不把数字转换成字符串?这个可能是从多方面的来考虑的,数字更易处理,容错性会更高一点。
所以上面这个表达就变成0 == 0 ,自然就输出true。
总结一下转换思路:
1. [] == false
2. [] == 0
3. '' == 0
4. 0 == 0
现在我们来回忆一下某个比较表达式:NaN !== NaN这个表达式为什么成立?
上面转换第三步,字符串和数字比较的时候,会将字符串转换成数字来比较。NaN是一个数字类型。
如果NaN等于自身的话,那'abc' == NaN这个表达式就会是true,天下大乱。
文章最后,给大家展示另外两个关于null的表达式比较。
领取专属 10元无门槛券
私享最新 技术干货