在 JavaScript 中,有一部分内容,情况复杂,容易出错,饱受争议但又应用广泛,这便是类型转换。
前言
将值从一种类型转换为另一种类型通常称为类型转换。
ES6 前,JavaScript 共有六种数据类型:Undefined、Null、Boolean、Number、String、Object。
我们先捋一捋基本类型之间的转换。
原始值转布尔
我们使用 Boolean 函数将类型转换成布尔类型,在 JavaScript 中,只有 6 种值可以被转换成 false,其他都会被转换成 true。
console.log(Boolean()) // false
console.log(Boolean(false)) // false
console.log(Boolean(undefined)) // false
console.log(Boolean(null)) // false
console.log(Boolean(+0)) // false
console.log(Boolean(-0)) // false
console.log(Boolean(NaN)) // false
console.log(Boolean("")) // false
注意,当 Boolean 函数不传任何参数时,会返回 false。
原始值转数字
我们可以使用 Number 函数将类型转换成数字类型,如果参数无法被转换为数字,则返回 NaN。
在看例子之前,我们先看 ES5 规范 15.7.1.1 中关于 Number 的介绍:
根据规范,如果 Number 函数不传参数,返回 +0,如果有参数,调用 ToNumber(value)
。
注意这个 ToNumber
表示的是一个底层规范实现上的方法,并没有直接暴露出来。
而 ToNumber
则直接给了一个对应的结果表。表如下:
参数类型结果UndefinedNaNNull+0Boolean如果参数是 true,返回 1。参数为 false,返回 +0Number返回与之相等的值String这段比较复杂,看例子
让我们写几个例子验证一下:
console.log(Number()) // +0
console.log(Number(undefined)) // NaN
console.log(Number(null)) // +0
console.log(Number(false)) // +0
console.log(Number(true)) // 1
console.log(Number("123")) // 123
console.log(Number("-123")) // -123
console.log(Number("1.2")) // 1.2
console.log(Number("000123")) // 123
console.log(Number("-000123")) // -123
console.log(Number("0x11")) // 17
console.log(Number("")) // 0
console.log(Number(" ")) // 0
console.log(Number("123 123")) // NaN
console.log(Number("foo")) // NaN
console.log(Number("100a")) // NaN
如果通过 Number 转换函数传入一个字符串,它会试图将其转换成一个整数或浮点数,而且会忽略所有前导的 0,如果有一个字符不是数字,结果都会返回 NaN,鉴于这种严格的判断,我们一般还会使用更加灵活的 parseInt 和 parseFloat 进行转换。
parseInt 只解析整数,parseFloat 则可以解析整数和浮点数,如果字符串前缀是 "0x" 或者"0X",parseInt 将其解释为十六进制数,parseInt 和 parseFl