类型转换
转换为字符串
需要字符串的地方,会隐式转换为 String
类型。比如 alert
。
显式转换:String(value)
转换为数字
不同类型原始值之间的算术运算、比较大小时,会隐式把操作数转换为 Number
类型。
js
console.log('6' / '2'); // 3
显式转换:Number(value)
转换规则:
String
:- 去掉首尾空白符,剩余纯数字字符串含有的数字
- 如果剩余字符串为空,结果为 0
- 如果剩余字符串不符合数字的格式,结果为 NaN
Boolean
:true
为 1,false
为 0null
:0undefined
:NaN
转换为布尔值
逻辑运算等需要布尔值的地方,会隐式转换为 Boolean
类型。
显式转换:Boolean(value)
转换规则:
0
、NaN
、空字符串、null
、undefined
转换为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 是
number
或default
,尝试调用valueOf()
和toString()
- 普通对象的
valueOf()
默认返回对象本身 - 如果
valueOf()
返回的不是原始值,toString()
会被使用,返回一个字符串,也就是说最终得到的值不一定与 hint 对应,只要求是原始值
- 普通对象的
从对象转换为原始值后,可能还需要进一步转换,根据上述的规则进行。
比如 [] == 0
:
- 不同类型值用
==
比较,会先转换为Number
[]
转换为原始值的 hint 为 number,调用valueOf()
返回数组本身不是原始值,然后调用toString()
返回空串 (内部调用join
用逗号拼接)- 空串转换为
Number
是0
- 最后
0 == 0