JS的类型转换
2020 javascript将值从一种类型转换为另一种类型通常称为类型转换(type casting),这是显式的情况;隐式的情况称为强制类型转换(coercion)。 – 《你不知道的 JavaScript》
JS 中的强制类型转换总是返回基本类型值。类型转换发生在静态类型语言的编译阶段,而强制类型转换则发生在动态类型语言的运行时(runtime)。为了更好区分它们,我们将它们分别称为“显示转换”和“隐式转换”。
表格
JavaScript 常见的类型转换表格如下:
undefined 和 null
值 | 布尔值 | 字符串 | 数字 | 对象 |
---|---|---|---|---|
undefined | false | “undefined” | NaN | throws TypeError |
null | false | “null” | 0 | throws TypeError |
boolean 转换
值 | 字符串 | 数字 | 对象 |
---|---|---|---|
true | “true” | 1 | new Boolean(true) |
false | “fasle” | 0 | new Boolean(false) |
string 转换
值 | 布尔值 | 数字 | 对象 |
---|---|---|---|
”” | fasle | 0 | new String(“”) |
“2” | true | 2 | new String(“2”) |
“one” | true | NaN | new String(“two”) |
number 转换
值 | 布尔值 | 字符串 | 对象 |
---|---|---|---|
0(-0) | false | “0” | new Number(0) |
NaN | false | “NaN” | new Number(NaN) |
1 | true | “1” | new Number(1) |
object 转换
值 | 布尔值 | 字符串 | 数字 |
---|---|---|---|
[] | true | ”” | 0 |
[9] | true | “9” | 9 |
{} | true | “[object Object]” | NaN |
object 转换成数字先转字符串,再转数字,否则抛出类型错误异常
隐式转换 Boolean false 值只有: undefined
, null
, ""
, 0
, -0
, NaN
特殊操作符
和其他的语言不同,在 JavaScript 中它们返回的并不是布尔值,是两个操作数中的一个(仅且一个)
- 只要
&&
前面是false
,返回&&
前面的值,否则将返&&
后面的值 - 只要
||
前面为true
,返回||
前面的值,否则返回||
后面的值
console.log(1 && 2); // 2
console.log(1 || 0); // 1
由上面可得知,我们只会对 &&
和 ||
前面的操作数进行类型转换,根据类型转换结果返回操作数
// 默认值
function func(a) {
a = a || 1000;
}
// 短路判断
bool && done();
隐式转换的规则
- NaN 不等于 NaN
- null 与 undefined 比较结果为 true。其他值跟它们比较都为 false
- 字符串和数字之间相等比较时,把字符串转换成数字
- 布尔值和其他类型相等比较时,把布尔值转换成数字。false 转换成 0,true 转换成 1
- 对象和字符串类型相等比较时,把对象转换成字符串
- 对象和数字类型相等比较时,把对象转换成数字
NaN == NaN; /* */ // false
'' == 0; /* */ // true
'' == false; /* */ // true
'' == []; /* */ // true
'' == {}; /* */ // false {}转成字符串 [object Object]
null == undefined; // true
[] == ![]; /* */ // true 操作符!优先级更高,![] 会被转换成 false,所以题目 [] == false
+ 和 -
如果 +
的其中一个操作数是字符串(或者通过隐式转换得到字符串),则执行字符串拼接。否则执行数字加法。
-
是数字减法运算符,只用于数字,因此会将字符串类型转换为数字。
'a' + 1; // "a1"
'2' + 1; // "21"
'a' - 1; // NaN
'3' - 1; // 2
'b' - 'a'; // NaN
'3' + 2 - 1; // 31
5 + +'3.14'; // 8.14
位运算
const PI = '3.14';
'' + PI; /* */ // '3.14' to String
~~PI; /* */ // 3 to integer
+PI; /* */ // 3.14
1 * PI; /* */ // 3.14 to float
!!PI; /* */ // true to boolean
[PI]; /* */ // ['3.14'] to array
参考链接
- 《你不知道的 JavaScript(中)》第 4 章 强制类型转换
- 《JavaScript 权威指南》