将值从一种类型转换为另一种类型通常称为类型转换(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 权威指南》