显式转换

Boolean():任何类型 boolean

数据类型转换为 true转换为 false
number任何非零数值(包括无穷大)0NaN
string任何非空字符串''
object任何对象-
undefined-undefined
null-null

!!x:相当于 Boolean(x)

Number():任何类型 number

数据类型数值
string整数:忽略前后空白字符。
找到第一个数字或正负号,遇到加号 + 转换为正数,遇到减号 - 转换为负数。
如果继续遇到非数字字符则返回 NaN

浮点数:忽略前后的空白字符。
找到第一个数字或正负号,遇到加号 + 转换为正数,遇到减号 - 转换为负数。
遇到第一个小数点继续,如果继续遇到非数字字符则返回 NaN,遇到第二个小数点也返回 NaN。

有效的其他进制数:转换为同样大小的十进制整数

空字符串:0

其他:NaN
booleantrue:1,false:0
undefinedNaN
null0
objecthint 是 number

String():任何类型 string

数据类型字符串
number对应的字符串数字
boolean'true''false'
undefined'undefined'
null'null'
objecthint 是 string

toString():任何类型 string

数据类型字符串
number可以传递一个参数表示转换的基数(2~36)
booleantrue 转为 ‘true’,false 转为 ‘false’
nullundefined没有这个方法
object严格调用 toString()

parseInt(string, radix):字符串 整数

  1. 忽略前面的空白字符
  2. 找到第一个数字或正负号,数字前面有一个 + 号转换为正数,有一个 - 号转换为负数
  3. 如果找到的第一个字符不是数字或正负号,或者从头到尾找不到数字字符则返回 NaN
  4. 直到遇到非数字字符,则转换结束
  5. 可以指定第二个参数 radix(2~36):
    • 转换时使用的基数(即进制)
    • 如果省略或为 0,则根据字符串推算(如果字符串中有 0x0X,则默认采用十六进制,其他为十进制)
    • 超出范围将返回 NaN

parseFloat(string):字符串 小数

  1. 忽略前面的空白字符
  2. 找到第一个数字或正负号,数字前面有一个 + 号转换为正数,有一个 - 号转换为负数
  3. 遇到的第一个小数点是有效的,之后的小数点是无效的
  4. 如果找到的第一个不是数字或正负号,或者从头到尾找不到数字字符则返回 NaN
  5. 直到遇到非数字字符或无效小数点,则转换结束
  6. 它没有第二个参数指定基数

Tip

Number() 和一元 + 比较严格,parseIntparseFloat 相对不那么严格

隐式转换

二元加(+

以下转换优先级从上到下:

  1. 当一侧为 string 类型,被识别为字符串拼接,并会优先将另一侧转换为字符串类型
  2. 两边都是原始类型,则将原始类型转换为 number 类型
  3. 当一侧有引用类型,则全部转为字符串拼接

二元加更倾向于字符串拼接,只有两边都是非字符串的原始类型时才转为数字加

一元加减(+-)和自增自减(++--)以及数学运算(+-*/%**

应用于非数值时,相当于 Number() 转换

比较大小(><>=<=

  • 两个字符串,采用 Unicode 编码顺序
  • 两个对象,转为原始值,hint 是 number
  • 其他情况全部转化为 number 再判断大小
  • NaN 与任何值进行比较都会返回 false
  • 比较运算符始终返回布尔值

相等(=====

相等运算符 ==:它会自动转换数据类型再比较,很多时候会导致问题

  1. 两边都是引用类型,比较内存地址
  2. NaN 这个特殊的 number 与其他值都不相等,包括它自己,判断 NaN 的方法
  3. nullundefined 相等,但是它们跟其他的类型都不相等
  4. boolean 和其他任何类型比较,boolean 首先被转换为 number 类型
  5. string 和 number 比较,将 string 转换为 number 类型
  6. 原始类型和引用类型做比较时,先 valueOf 后 toString,hint 是 default

全等运算符 ===:它不会自动转换数据类型,如果数据类型不一致,返回 false,如果一致,再比较

对象转换为原始值

对象转换有三种情况(hint):

  • “number”:明确期望被转为数字
  • ”string”:明确期望被转为字符串
  • ”default”:不确定运算符需要什么数据类型(如:二元加法 + 可用于字符串(连接),也可以用于数字(相加),与其他类型判断是否 == 时)

对象的转换过程是查找并调用下面三个对象方法:

  1. obj[Symbol.toPrimitive](hint):如果存在,会被用于所有 hint 情况,无需更多其他方法
  2. 否则,如果 hint 是 “string”,尝试调用 obj.toString()obj.valueOf()
  3. 否则,如果 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'
datenumber 毫秒时间戳'Mon Jun 10 2024 20:03:52 GMT+0800 (中国标准时间)'