JS 类型转换整理

260 阅读8分钟

类型转换规则

Number()

  • 如果是 Boolean 值,truefalse 将分别被转换为 10
  • 如果是数字值,只是简单的传入和返回。
  • 如果是 null 值,返回 0
  • 如果是 undefined,返回 NaN
  • 如果是字符串,遵循以下规则:
    • 如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值。
    • 如果字符串中包含有效的浮点格式,则将其转换为对应的浮点数值。
    • 如果字符串中包含有效的十六进制格式,则将其转换为相同大小的十进制整数值。
    • 如果字符串是空的(不包含任何字符),则将其转换为 0
    • 如果字符串中包含除上述字符以外的字符,则将其转换为 NaN
  • 如果是对象,则调用对象的 valueOf() 方法,然后依照前面的规则转换返回值。如果转换的结果是 NaN,则调用对象的 toString() 方法,然后再依照前面的规则转换返回的字符串值。

parseInt

  • 忽略字符串前面的空格,直到找到第一个非空字符。
  • 如果第一个字符不是数字字符或者符号,返回 NaNparseInt 转换空字符安返回 NaN
  • parseInt 第二个参数定义了转换使用的基数(即多少进制),第二个参数可以接受 2 和 36 之间的整数。

parseFloat

  • 忽略字符串前面的空格,直到找到第一个非空字符。
  • 如果第一个字符不是数字字符或者符号,返回 NaNparseFloat 转换空字符安返回 NaN
  • 字符串中的第一个小数点是有效的,而第二个小数点就是无效的了,因此它后面的字符串将被忽略。
  • 如果字符串包含的是一个可解析为整数的数(没有小数点,或者小数点后面都是零),parseFloat()会返回整数。
  • parseFloat 只解析 10 进制。

String()

  • 如果值有 toString() 方法,则调用该方法(没有参数)并返回相应的结果。
  • 如果值为 null,则返回 "null"
  • 如果值为 undefined,则返回 "undefined"

++ 和 -- 操作符

  • 在应用一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减 1 的操作。
  • 在应用一个不包含有效数字字符的字符串时,将变量的值设置为 NaN
  • 在应用于布尔值 false 时,先将其转换为 0 再执行加减 1 的操作。
  • 在应用于布尔值 true 时,先将其转换为 1 再执行加减 1 的操作。
  • 在应用于浮点数值时,执行加减 1 的操作。
  • 在应用于对象时,先调用对象的valueOf() 方法,以取得一个可供操作的值。然后应用上述规则,如果结果为 NaN,则调用对象的 toString() 方法,再应用上述规则。

一元加减操作符

类似于 Number() 转换规则。

逻辑非( ! )

  • 如果操作数是一个对象,返回 false
  • 如果操作数是一个空字符串,返回 true
  • 如果操作数是一个非空字符串,返回 false
  • 如果操作数是数值 0,返回 true
  • 如果操作数是任意非 0 数值(包括 Infinity ),返回 false
  • 如果操作数是 null,返回 true
  • 如果操作数是 NaN,返回 true
  • 如果操作数是 undefined,返回 true

逻辑与( && )

  • 如果第一个操作数是对象,则返回第二个操作数。
  • 如果第二个操作数是对象,则只有在第一个操作数的求值结果为 true 的情况下,才返回该对象。
  • 如果两个操作数都是对象,则返回第二个操作数。
  • 如果有一个操作数为 null,则返回 null
  • 如果有一个操作数为 NaN,则返回 NaN
  • 如果有一个操作数为 undefined,则返回 undefined

逻辑或( || )

  • 如果第一个操作数是对象,则返回第一个操作数。
  • 如果第一个操作数的求值结果为 false,则返回第二个操作数。
  • 如果两个操作数都是对象,则返回第一个操作数。
  • 如果两个操作数都为 null, 则返回 null
  • 如果两个操作数都为 NaN,则返回 NaN
  • 如果两个操作数都是 undefined,则返回 undefined

乘法( * )

  • 如果操作数都是数值,执行常规的乘法计算,如果计算结果超过数值范围,则返回 Infinity-Infinity
  • 如果有一个操作数是 NaN,则结果是 NaN
  • 如果是 Infinity0 相乘,结果是 NaN
  • 如果是 Infinity 和非 0 数值相乘,则结果是Infinity-Infinity,取决于有符号操作数的符号。
  • 如果是 InfinityInfinity 相乘,结果是 Infinity
  • 如果有一个操作数不是数值,则在后台调用 Number() 将其转换为数值,然后再应用上面的规则。

除法( / )

  • 如果操作数都是数值,执行常规的乘法计算,如果计算结果超过数值范围,则返回 Infinity-Infinity
  • 如果有一个操作数是 NaN,则结果是 NaN
  • 如果是 InfinityInfinity 除,则结果是 NaN
  • 如果是 00 除,则结果是 NaN
  • 如果是非 0 的有限数被 0 除,则结果是 Infinity-Infinity,取决于有符号操作数的符号。
  • 如果是 Infinity 被任何非 0 数值除,则结果是 Infinity-Infinity
  • 如果有一个操作数不是数值,则在后台调用 Number() 将其转换为数值,然后再应用上面的规则。

取余( % )

  • 如果操作数都是数值,执行常规的除法计算,返回除得的余数。
  • 如果被除数是无穷大值,而除数是有限大的数值,则结果是 NaN
  • 如果被除数是有限大的数值,而除数是 0,则结果是 NaN
  • 如果是 InfinityInfinity 除,则结果是 NaN
  • 如果被除数是有限大的数值,而除数是无穷大的数值,则结果是被除数。
  • 如果被除数是 0,则结果是 0
  • 如果有一个操作数不是数值,则在后台调用 Number() 将其转换为数值,然后再应用上面的规则。

加法( + )

  • 如果两个操作符都是数值,执行常规的加法计算,然后分别以下规则返回结果。
    • 如果有一个操作数是 NaN,则结果是 NaN
    • 如果是 InfinityInfinity,则结果是 Infinity
    • 如果是 -Infinity-Infinity,则结果是 -Infinity
    • 如果是 Infinity-Infinity,则结果是 NaN
    • 如果是 +0+0,则结果是 +0
    • 如果是 -0-0,则结果是 -0
    • 如果是 +0-0,则结果是 +0
  • 如果有一个操作数是字符串,应用如下规则:
    • 如果两个操作数都是字符串,则将第二个操作数与第一个操作数拼接。
    • 如果只有一个操作数是字符串,则将另一个操作数转换为字符串,然后拼接。
  • 如果有一个操作数是对象、数值或布尔值,则调用它们的 toString() 方法取得相应的字符串值,然后再应用前面关于字符串的规则。对于 undefinednull,分别调用 String() 函数并取得字符串 "undefined""null"

减法( - )

  • 如果两个操作符都是数值,执行常规的减法计算,然后分别以下规则返回结果。
  • 如果有一个操作数是 NaN,则结果是 NaN
  • 如果是 InfinityInfinity,则结果是 NaN
  • 如果是 -Infinity-Infinity,则结果是 NaN
  • 如果是 Infinity-Infinity,则结果是 Infinity
  • 如果是 -InfinityInfinity,则结果是 -Infinity
  • 如果是 +0+0,则结果是 +0
  • 如果是 +0-0,则结果是 -0
  • 如果是 -0-0,则结果是 +0
  • 如果有一个操作数是字符串、布尔值、nullundefined,则先在后台调用 Number() 函数将其转换为数值,然后再根据前面的规则执行减法计算。如果转换的结果是 NaN,则减法的结果就是 NaN
  • 如果有一个操作数是对象,则调用对象的 valueOf() 方法以取得表示该对象的数值。如果得到的值是 NaN,则减法的结果为 NaN。如果对象没有 valueOf() 方法,则调用 toString() 方法并将取得的字符串转换为数值。

关系操作符(>=、>、<、<=)

  • 如果两个操作数都是数值,则执行数值比较。
  • 如果两个操作数都是字符串,则比较两个字符串对应的字符串编码。
  • 如果一个操作数是数值,则将另一个操作数转换为一个数值,然后进行数值比较。
  • 如果一个操作数是对象,则调用对象的 valueOf() 方法,用得到的结果按照前面的规则执行比较。如果对象没有 valueOf() 方法,则调用 toString() 方法,并用得到的结果根据前面的规则执行比较。
  • 如果一个操作数是布尔值,则将其转换为数值,再进行比较。

相等和不相等( == 或 != )

  • 如果有一个操作数是布尔值,则将其转换为数值,再进行比较。
  • 如果有一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值。
  • 如果一个操作数是对象,另一个不是,则调用对象的 valueOf() 方法,用得到的基本类型值按照前面的规则进行比较。
  • nullundefined 相等。
  • 要比较相等性之前,不能将 nullundefined 转换为其他任何值。
  • 如果有一个操作数是 NaN,则相等性操作符返回 false,不相等性操作符返回 true
  • 如果两个操作数都是对象,则比较它们是不是同一个对象。