Skip to content

类型转换

将值从一种类型转换为另一种类型通常称为类型转换(type casting),这是显式的情况;隐式的情况称为强制类型转换(coercion)。

ToString

基本类型值的字符串化规则为:null 转换为"null", undefined 转换为"undefined",true 转换为"true"。数字的字符串化则遵循通用规则,极小和极大的数字使用指数形式。

js
const a = 10700000000000000000000000
a.toString() // '1.07e+25'

对普通对象来说,除非自行定义,否则 toString()(Object.prototype.toString())返回内部属性[[Class]]的值。

js
const obj = {}
obj.toString() // '[object Object]'

数组的默认 toString()方法经过了重新定义,将所有单元字符串化以后再用","连接起来,与调用 join(',') 结果一致。

js
const a = [1, 2, 3]
a.toString() // '1,2,3'
a.join(',') // '1,2,3'

ToNumber

true 转换为 1, false 转换为 0。undefined 转换为 NaN, null 转换为 0, '' 转换为 0。

对象(包括数组)会首先被转换为相应的基本类型值,检查该值是否有 valueOf()方法。如果有并且返回基本类型值,就使用该值进行强制类型转换。如果没有就使用 toString()的返回值(如果存在)来进行强制类型转换。如果 valueOf()和 toString()均不返回基本类型值,会产生 TypeError 错误。

js
const a = {
  valueOf() {
    return '42'
  }
}
const b = {
  toString() {
    return '43'
  }
}
const c = [4, 5]
c.toString = function () {
  return this.join('')
}
Number(a) // 42
Number(b) // 43
Number(c) // 45

ToBoolean

这些是假值:undefined、null、false、+0、-0 和 NaN、"",假值的布尔强制类型转换结果为 false。我们可以理解为假值列表以外的值都是真值。

js
Boolean(undefined) // false
Boolean(null) // false
Boolean(false) // false
Boolean(+0) // false
Boolean(-0) // false
Boolean(NaN) // false
Boolean('') // false

假值对象

假值对象看起来和普通对象并无二致,但将它们强制类型转换为布尔值时结果为 true。

js
const a = new Boolean(false)
const b = new Number(0)
const c = new String('')
const d = Boolean(a && b && c)