首先我们要知道,在 JS 中类型转换只有三种情况,分别是:
- 转换为布尔值
- 转换为数字
- 转换为字符串 | 原始值 | 转换目标 | 结果 | | :—-: | :—-: | :—-: | | number | 布尔值 | 除了0、-0、NaN 都是 true | | string | 布尔值 | 除了空串都为 true | | underfined、null | 布尔值 | false | | 引用类型 | 布尔值 | true | | number | 字符串 | 5 => ‘5’ | | Boolean、函数、Symbol | 字符串 | ‘true’ | | 数组 | 字符串 | [1, 2] => ‘1, 2’ | | 对象 | 字符串 | ‘[object Object]’ | | string | 数字 | ‘1’ => 1, ‘a’ => NaN | | 数组 | 数字 | 空数组为0,存在一个元素且为数字转数字,其他为NaN | | null | 数字 | 0 | | 除了数组的引用类型 | 数字 | NaN | | Symbol | 数字 | 抛错 |
转Boolean
在条件判断时,除了 undefined
, null
, false
, NaN
, ''
, 0
, -0
,其他所有值都转为 true
,包括所有对象。
对象转原始类型
对象在转换类型的时候,会调用内置的 [[ToPrimitive]]
函数,对于该函数来说,算法逻辑一般来说如下:
- 如果已经是原始类型了,那就不需要转换了
- 调用
x.valueOf()
,如果转换为基础类型,就返回转换的值 - 调用
x.toString()
,如果转换为基础类型,就返回转换的值 - 如果都没有返回原始类型,就会报错