就两种
一:对于布尔值的转换
除了NaN,null,undefine,0,空字符,false,其他都是转为true
举几个例子:
if(""){console.log('暴躁')} 控制台会打出暴躁不?
当然不会啦,因为 "" 是空字符串
那么 if(" "){console.log('暴躁')} 控制台会打出暴躁不?
会。为啥?因为 " " 是空白字符串而不是字符串,我丢!
二:对于 == 比较运算符的转换
-
两边都是原始类型的就 用Number() 函数转成数字去比较
举些栗子
'我丢' == true? '我丢' 去Number()一下肯定是 NaN啦,true肯定是1啦,那能相等吗?肯定不行(false转化后是0喔)"" == 0," " == 0结果也都是true,为啥?请自己Number()一下!" " == true和!" " == false呢?像我这样的sb一开始肯定以为 空白字符串转化为数字是0啊,那么取反不就是true咯,,那么!" " == true结果就是true,!" " == false结果就是false咯。然而!请注意运算符
!,我们的先转换成布尔值再转成数字。。。也就是 " "转成布尔值是true (请看一:对于布尔值的转换),取反变成false!" " == true结果就是false,!" " == false结果就是true -
特别的:undefined转为 NaN, null转为0 ,但是!undefined == null 结果是他妈的 true 不要问我为什么,我也不知道。
他们两个跟其他的类型比的时候都是false,可能这就是基佬吧,爱了爱了。
-
一边对象跟一边原始类型的比较,原始类型是啥类型,对象就转换成啥类型
此处请参考阮一峰大佬的强制类型转换 wangdoc.com/javascript/…
其实就是根据原始类型的不同调用自身的 valueOf 和 toString 方法,但如果你对对象的 valueOf 和 toString 进行了重写,那么会优先调用你改写的方法。
而布尔值是双方都转换成数字去比较。