显式转换
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- 比较运算符始终返回布尔值
相等(==
,===
)
相等运算符 ==
:它会自动转换数据类型再比较,很多时候会导致问题
- 两边都是引用类型,比较内存地址
NaN
这个特殊的 number 与其他值都不相等,包括它自己,判断 NaN 的方法null
和undefined
相等,但是它们跟其他的类型都不相等- boolean 和其他任何类型比较,boolean 首先被转换为 number 类型
- string 和 number 比较,将 string 转换为 number 类型
- 原始类型和引用类型做比较时,先 valueOf 后 toString,hint 是 default
全等运算符 ===
:它不会自动转换数据类型,如果数据类型不一致,返回 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 (中国标准时间)' |