显式转换
Boolean():任何类型 ⇒ boolean
| 数据类型 | 转换为 true | 转换为 false |
|---|---|---|
number | 任何非零数值(包括无穷大) | 0,NaN |
string | 任何非空字符串 | '' |
object | 任何对象 | - |
undefined | - | undefined |
null | - | null |
!!x:相当于Boolean(x)
Number():任何类型 ⇒ number
| 数据类型 | 数值 |
|---|---|
string | 整数:忽略前后空白字符。找到第一个数字或正负号,遇到加号 + 转换为正数,遇到减号 - 转换为负数。如果继续遇到非数字字符则返回 NaN。浮点数:忽略前后的空白字符。找到第一个数字或正负号,遇到加号 + 转换为正数,遇到减号 - 转换为负数。遇到第一个小数点继续,如果继续遇到非数字字符则返回 NaN,遇到第二个小数点也返回 NaN。 有效的其他进制数:转换为同样大小的十进制整数空字符串:0其他:NaN |
boolean | true:1,false:0 |
undefined | NaN |
null | 0 |
object | hint 是 number |
String():任何类型 ⇒ string
| 数据类型 | 字符串 |
|---|---|
number | 对应的字符串数字 |
boolean | 'true','false' |
undefined | 'undefined' |
null | 'null' |
object | hint 是 string |
toString():任何类型 ⇒ string
| 数据类型 | 字符串 |
|---|---|
number | 可以传递一个参数表示转换的基数(2~36) |
boolean | true 转为 ‘true’,false 转为 ‘false’ |
null 和 undefined | 没有这个方法 |
object | 严格调用 toString() |
parseInt(string, radix):字符串 ⇒ 整数
- 忽略前面的空白字符
- 找到第一个数字或正负号,数字前面有一个
+号转换为正数,有一个-号转换为负数 - 如果找到的第一个字符不是数字或正负号,或者从头到尾找不到数字字符则返回
NaN - 直到遇到非数字字符,则转换结束
- 可以指定第二个参数 radix(2~36):
- 转换时使用的基数(即进制)
- 如果省略或为 0,则根据字符串推算(如果字符串中有
0x或0X,则默认采用十六进制,其他为十进制) - 超出范围将返回
NaN
parseFloat(string):字符串 ⇒ 小数
- 忽略前面的空白字符
- 找到第一个数字或正负号,数字前面有一个
+号转换为正数,有一个-号转换为负数 - 遇到的第一个小数点是有效的,之后的小数点是无效的
- 如果找到的第一个不是数字或正负号,或者从头到尾找不到数字字符则返回
NaN - 直到遇到非数字字符或无效小数点,则转换结束
- 它没有第二个参数指定基数
Tip
Number()和一元+比较严格,parseInt和parseFloat相对不那么严格
隐式转换
二元加(+)
以下转换优先级从上到下:
- 当一侧为 string 类型 或 引用类型,被识别为字符串拼接
- 两边都是原始类型,则将原始类型转换为 number 类型
二元加更倾向于字符串拼接,只有两边都是非字符串的原始类型时才转为数字加
一元加减(+,-)和自增自减(++,--)以及数学运算(+,-,*,/,%,**)
应用于非数值时,相当于 Number() 转换
比较大小(>,<,>=,<=)
- 两个字符串,采用 Unicode 编码顺序
- 两个对象,转为原始值,hint 是 number
- 其他情况全部转化为 number 再判断大小
NaN与任何值进行比较都会返回 false- 比较运算符始终返回布尔值
相等(==,===)
相等运算符 ==:它会自动转换数据类型再比较,很多时候会导致问题
- string 和 number 比较,将 string 转换为 number 类型
- boolean 和其他任何类型比较,boolean 首先被转换为 number 类型
- 两边都是引用类型,比较内存地址
- 原始类型和引用类型做比较时,引用类型先 valueOf 后 toString,hint 是 default
null和undefined相等,但是它们跟其他的类型都不相等NaN与其他值都不相等,包括它自己,判断 NaN 的方法
全等运算符 ===:它不会自动转换数据类型,如果数据类型不一致,返回 false,如果一致,再比较
对象转换为原始值
对象转换有三种情况(hint):
- “number”:明确期望被转为数字
- ”string”:明确期望被转为字符串
- ”default”:不确定运算符需要什么数据类型(如:二元加法
+可用于字符串(连接),也可以用于数字(相加),与其他类型判断是否==时)
对象的转换过程是查找并调用下面三个对象方法:
obj[Symbol.toPrimitive](hint):如果存在,会被用于所有 hint 情况,无需更多其他方法- 否则,如果 hint 是 “string”,尝试调用
obj.toString()或obj.valueOf() - 否则,如果 hint 是 “number” 或 “default”,尝试调用
obj.valueOf()或obj.toString()
Warning
Symbol.toPrimitive必须返回一个原始值,不然报错- 对于
valueOf()和toString(),如果其中一个返回对象,则忽略其返回值,使用另一个的返回值;如果两者都不存在,或者两者都没有返回一个原始值,则报错
默认情况下,普通对象具有 toString 和 valueOf 方法:
- toString 方法返回一个字符串
"[object Object]" - valueOf 方法返回对象自身
具有 Symbol.toPrimitive 的内置对象:Date,Symbol
对象的转换
| 对象 | valueOf() | toString() |
|---|---|---|
| 普通对象(plain object) | 本身 | '[object Object]' |
| array | 本身 | '1,2,3' 类似 join(',') |
| function | 本身 | 'function f() {...}' |
| regexp | 本身 | '/abc/g' |
| date | number 毫秒时间戳 | 'Mon Jun 10 2024 20:03:52 GMT+0800 (中国标准时间)' |