JavaScript的类型转换
引子
平时工作中使用 JavaScript 中,有时候会不自觉的遇到类型转换相关的问题还不自知,下面介绍两种常见的类型转换情况,以及转换结果,注意不要在工作中使用这种写法,这种写法会导致结果的不明确。
if(xx)
有时候,为了简便,我们可能会写出如下代码:
1 | var a; |
但是实际上,即使 a 有值,例如a=" "
依旧会打印a 未赋值
,这是因为括号里的表达式会强制转化为布尔类型,转化规则如下。
类型 | 结果 |
---|---|
Undefined | False |
Null | False |
Boolean | 直接判断 |
Number | +0,-0,NaN 为 false,其他为 true |
String | 空字符串为 false,其他均为 true |
Object | True |
a == b
JavaScript
中==
判断会发生类型转换,转化为Number
类型进行比较,得出结果,转换规则如下:
a | b | 结果 |
---|---|---|
null | undefined | true |
Number | String | x == toNumber(y) |
Boolean | (any) | toNumber(x) == y |
Object | String or Number | toPrimitive(x) == y |
otherwise | otherwise | false |
toNumber
type | Result |
---|---|
Undefined | NaN |
Null | 0 |
Boolean | ture -> 1, false -> 0 |
String | “abc” -> NaN, “123” -> 123 |
toPrimitive
对于 Object 类型,会先尝试调用.valueOf
方法获取结果,如果该方法未定义,就会调用toString
方法获取结果。
常见题目
if(xxx)
1 | // 题目1:如下代码输出什么? |
a == b
1 | "" == 0; //题目1 true |
小结
平时工作中一定不要使用if(xxx)
和a==b
的写法,遇到这种写法时,依据上述方式进行判断,就能很快得到结果。