JavaScript隐式转换成布尔类型和==
布尔转换
在JavaScript中,最令人头疼的一类语法,大概就是if判断中填的变量到底是true还是false。C/C++中的if,任何不是0的变量都会被理解为true,JavaScript就有所不同。
先给出规则,JavaScript中,隐式转换成布尔类型时,各种数据类型遵循如下规则:
类型 | 结果 |
---|---|
Undefined | false |
Null | false |
Boolean | |
Number | +0,-0,NaN为false,其余为true |
String | 空串“”为false,其余为true |
Object | 均为true |
其中不太符合直觉的大概只有空串为true这一条。
即使有这样的规则,在开发中,我们最好显示写出代码的含义,方便自己阅读和团队协作。
==
我们一般不推荐使用==,而统一使用不会造成误解的===。然而,在面试中、或是在装逼时,我们难免需要使用==,这里,我为大家整理了==的用法。
规则
==运算符会将符号两边的变量进行转换之后比较,转换规则如下:
x | y | 结果 |
---|---|---|
null | undefined | true |
Number | String | x == toNumber(y) |
Boolean | (any) | toNumber(x) == y |
Object | String to Number | toPrimitive(x) == y |
otherwise | otherwise | false |
使用文字表述如下:
- null和undefine相等。
- 字符串转化为数字再和数字比较。
- 布尔类型均转化为数字0或1。
- 对象转化为数字和字符串转化成的数字比较。
- 其余均为false。
更简洁地说:不是数字的都转成数字!
强转数字toNumber()
一般的字符串转数字满足如下规则:
- 字符串中全是数,直接转。
- 字符串中有非数字字符,返回NaN。
特别注意一下两个特例:
"" == 0;
" " == 0;
联系之前的布尔类型转化,空串和多个空格均转化为0,也就是false。