javascript中的类型转换

153 阅读2分钟

js中的类型转换

在javascript中,基础类型转换分为两类,手动显示转换自动隐式转换。

显式转换

通过js内置的全局函数或方法,实现变量之间的显式转换,常见的函数如下。

Number("3")  // 3
String(false)  // "false"
Boolean([])  // true

除了null和undefined之外的所有值都有toString方法,返回结果通常和String()相同。

隐式转换

在js的运算中,运算符操作的变量属于不同类型,js的编译器可能会进行自动类型转换。

null == undefined  // true: 两者都代表值的不存在,区分用===判断
"0" == 0  // true: 字符串转数值
0 == false  // true:  布尔值转数值
"0" == false  // true: 字符串转数值,布尔值转数值,再比较

除了==操作符会转换类型外,还有如下类型转换的方法:

var x = 1
x + "" // "1" 相当于String(x)

var s = "1"
+x  // 1 相当于NUmber(x)
x - 0  // 相当于NUmber(x)
!!x  // 相当于Boolean(x)

对象到原始值的转换

对象到原始值的转换要复杂一些。主要原因在于某些对象类型有不止一种原始值的表示。例如Date对象可以用字符串表示,也可以用时间戳表示。 javascript规范定义了对象转原始值的3种基本算法。

  1. 偏字符串:尽可能返回字符串。
  2. 偏数值:尽可能返回数值。
  3. 无偏好:由类定义自己的转换规则。 在介绍这三种算法之前,先解释两个方法toString()valueOf()

toString():返回对象的字符串表示。

({x:1, y:2}).toString()  // "[Object Object]"

很多类都定义了自己特有的toString版本。比如,Array类的toString()会将数组的每个元素转换为字符串,然后以逗号作为分隔符拼接起来。

[1,2,3].toString()  // "1,2,3"
( function(x){f(x)} ).toString()  // "function(x) {f(x)}"
/\d+/g.toString()  // "/\\d+/g"
let d = new Date(2022, 4, 5)
d.toString()  // "Thu May 05 2022 00:00:00 GMT+0800 (中国标准时间)"

valueOf():将对象转换为代表对象的原始值,默认情况下返回对象本身。

let d = new Date(2022, 4, 5)
d.valueOf()  // 1651680000000  => 时间戳

偏字符串算法首先尝试toString()方法,如果转换对象有该方法且返回原始值,则js使用该原始值。例如,Object类toString()会将键值对转换为"Object"如果toString不存在,尝试valueOf()方法,如果没有则报TypeError错误。

偏数值算法和偏字符串算法类似,只不过先尝试valueOf(),再尝试toString()。(应用:日期时间戳)

无偏算法取决于被转换对象的类。如果是Date对象,则js使用偏字符串算法;如果是其他类型的对象,则使用偏数值算法。