# JS的类型转换

4 min read
Table of Contents

将值从一种类型转换为另一种类型通常称为类型转换(type casting),这是显式的情况;隐式的情况称为强制类型转换(coercion)。 — 《你不知道的 JavaScript》

JS 中的强制类型转换总是返回基本类型值。类型转换发生在静态类型语言的编译阶段,而强制类型转换则发生在动态类型语言的运行时(runtime)。为了更好区分它们,我们将它们分别称为“显示转换”和“隐式转换”。

表格

JavaScript 常见的类型转换表格如下:

undefined 和 null

值布尔值字符串数字对象
undefinedfalse”undefined”NaNthrows TypeError
nullfalse”null”0throws TypeError

boolean 转换

值字符串数字对象
true”true”1new Boolean(true)
false”fasle”0new Boolean(false)

string 转换

值布尔值数字对象
""fasle0new String("")
“2”true2new String(“2”)
“one”trueNaNnew String(“two”)

number 转换

值布尔值字符串对象
0(-0)false”0”new Number(0)
NaNfalse”NaN”new Number(NaN)
1true”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 权威指南》

More Posts

# BFC

8 min read

BFC(Block Formatting Context) 块级格式化上下文。它是块级布局发生的区域,也是浮动与其他元素交互的区域。

# Map

6 min read

Map 和 Set 是 ES6 中新增的数据结构,Map 类似于对象,但可以使用对象或者 map 值作为键值。我们一般将 Map 跟 Object 进行比较。