Skip to content

类型转换

转换为字符串

需要字符串的地方,会隐式转换为 String 类型。比如 alert

显式转换:String(value)

转换为数字

不同类型原始值之间的算术运算、比较大小时,会隐式把操作数转换为 Number 类型。

js
console.log('6' / '2'); // 3

显式转换:Number(value)

转换规则:

  • String
    • 去掉首尾空白符,剩余纯数字字符串含有的数字
    • 如果剩余字符串为空,结果为 0
    • 如果剩余字符串不符合数字的格式,结果为 NaN
  • Booleantrue 为 1,false 为 0
  • null:0
  • undefined:NaN

转换为布尔值

逻辑运算等需要布尔值的地方,会隐式转换为 Boolean 类型。

显式转换:Boolean(value)

转换规则:

  • 0NaN、空字符串、nullundefined 转换为 false
  • 其他值转换为 true

对象转换为原始值

JS 对象不支持运算符重载,算术运算中的对象会隐式转换为原始值。还有一些需要原始值的地方,传入对象也会进行隐式转换。

所有需要布尔值的上下文,传入对象均转换为 true

对象向原始值的转换规则依据的是 “hint”,有 3 种类型:

  • string:转换为字符串
  • number:转换为数字
  • default:当运算符不确定期望值的类型时,少数情况下发生
    • 二元加法 + 既可以相加数字,也可以拼接字符串,相加对象时不知道应该转换为哪种类型
    • 对象与原始值进行 == 比较时,也不知道应该转换为哪种类型
    • 但是 <> 使用 number hint,这是历史原因
    • 除了 Date,所有内建对象对 default 的实现与 number 相同

转换过程:

  • 尝试调用 [Symbol.toPrimitive](hint)
    • 必须返回一个原始值,否则报错
  • 如果 hint 是 string,尝试调用 toString()valueOf()
    • 普通对象的 toString() 默认返回 [object Object]
    • 如果这两个方法返回非原始值,返回值会被忽略
  • 如果 hint 是 numberdefault,尝试调用 valueOf()toString()
    • 普通对象的 valueOf() 默认返回对象本身
    • 如果 valueOf() 返回的不是原始值,toString() 会被使用,返回一个字符串,也就是说最终得到的值不一定与 hint 对应,只要求是原始值

从对象转换为原始值后,可能还需要进一步转换,根据上述的规则进行。

比如 [] == 0

  1. 不同类型值用 == 比较,会先转换为 Number
  2. [] 转换为原始值的 hint 为 number,调用 valueOf() 返回数组本身不是原始值,然后调用 toString() 返回空串 (内部调用 join 用逗号拼接)
  3. 空串转换为 Number0
  4. 最后 0 == 0