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种基本算法。
偏字符串:尽可能返回字符串。偏数值:尽可能返回数值。无偏好:由类定义自己的转换规则。 在介绍这三种算法之前,先解释两个方法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使用偏字符串算法;如果是其他类型的对象,则使用偏数值算法。