javascript隐式转换
隐式转换为 Boolean
javascript需要一个 boolean 类型的值时(例如 if 语句),会进行隐式转换将非 boolean 类型的值转换为 boolean 类型的值。只有以下值转换为 false ,其他所有值都转换为 true。
Boolean(undefined) === false
Boolean(null) === false
Boolean(NaN) === false
Boolean(0) === false
Boolean('') === false
数学运算符的隐式转换
- 减法、乘法、除法
在对各种非 Number 类型的值进行减、乘、除法运算时,会先将非 Number 类型转换成 Number 类型,再进行运算。
成功转换示例
Number([]) === 0
Number([3]) === 3
Number(['3']) === 3
Number(null) === 0
Number(true) === 1
Number(false) === 1
Number('') === 0
Number('3') === 3
失败转换示例
Number({}) ==> NaN
Number("3q") ==> NaN // 包含非数字的字符串不可转换
Number(undefined) ==> NaN
-
加法
加法比较特殊可以当作数学运算符,也可以拼接字符串,也就表示使用时需要对 + 使用形式进行区分。- 当一侧为 String 类型,进行字符串拼接,并将另一侧转换为字符串类型
console.log(1 + "test") ==> "1test" console.log(true + "test") ==> "truetest" console.log(false+ "test") ==> "falsetest" console.log(null+ "test") ==> "nulltest" console.log(undefined+ "test") ==> "undefinedtest" console.log([]+ "test") ==> "test" console.log([1,2]+ "test") ==> "1,2test" console.log({}+ "test") ==> "[object Object]test"
- 当一侧为 Number 类型,另一侧为引用类型,都将转换成字符串类型并进行字符串拼接
console.log(1 + {}) ==> "1[object Object]"
- 当一侧为 Number 类型,另一侧为原始类型时,会将原始类型转换为 Number 类型
console.log(1 + true) ==> 2 console.log(1 + false) ==> 1 console.log(1 + null) ==> 1
==的隐式类型转换
当 == 两侧的数据类型不一致时,会对两侧数据进行隐式转换,将其转换成统一类型的值再进行比较。
- NaN 和任何类型的值(包括NaN)比较时永远返回 false。
- null 和 undefined 比较时为 true,除此之外 null、undefined 和其他值比较都为 false。
console.log(null== undefined) ==> true
console.log(null== "") ==> false
console.log(null== 0) ==> false
console.log(null== false) ==> false
console.log(undefined== "") ==> false
console.log(undefined== 0) ==> false
console.log(undefined== false) ==> false
- Boolean 类型和其他任何类型比较时,Boolean 类型转换成 Number 类型。
console.log(true == 1) ==> true // 因为Number(true) = 1,所以 1 == 1 为true
console.log(true == 2) ==> false // 因为Number(true) = 1,所以 1 == 2 为false
- String 类型和 Number 类型比较时,将 String 类型转换为 Number 类型。
console.log("1"== 1) ==> true // 因为Number("1") = 1,所以 1 == 1 为true
console.log(""== 1) ==> false // 因为Number("") = 0,所以 0 == 1 为false
-
原始类型和引用类型比较时,引用类型会调用 toPromitive 操作根据规则转换为原始类型。
- 首先检查是否存在 valueOf 方法返回原始值,如果返回原始值直接使用。
- valueOf 方法失败,调用 toString 方法返回原始值,如果返回原始值直接使用,否则抛出 TypeError 错误。
console.log([] == ![]) ⇒ true
/*
比较过程:
1. [] == false
2. 0 == false
3. 0 == 0 ==> true
*/
- 引用类型和引用类型比较,始终返回 false。因为两者比较的是对应的地址。
注:
值 | Boolean | String | Nubmer |
---|---|---|---|
true | true | “true” | 1 |
false | false | “false” | 0 |
null | false | “null” | 0 |
undefined | false | “undefined” | NaN |
NaN | false | “NaN” | NaN |
0 | false | “0” | 0 |
12 | true | “12” | 12 |
“” | false | “” | 0 |
“12” | true | “12” | 12 |
function(){} | true | “function(){}” | NaN |
{} | true | “[object Object]” | NaN |
[] | true | “” | 0 |
[“12”] | true | “12” | 12 |
[“ab”] | true | “ab” | NaN |
[12,“ab”] | true | “12,ab” | NaN |