各位前端er,今天咱们来聊聊JS中最让人头疼又不得不爱的话题------类型转换。这玩意儿就像JS里的"七十二变",有时候能帮你化险为夷,有时候却能让你debug到怀疑人生。
== vs ===:马虎鬼与强迫症的对决
==
就像个马虎的老大哥,只要值差不多就点头:1 == '1'
?行!0 == false
?没问题!甚至null == undefined
?都是好兄弟!
而===
则是个十足的强迫症患者,必须值和类型完全一样才罢休:1 === '1'
?抱歉,类型不同免谈!0 === false
?一边儿去,布尔不是数字!
类型转换的两种打开方式
1. 显式转换:光明正大的变形
这就像明着说"我要变身":
Boolean(x)
:除了0
、''
、null
、undefined
、NaN
和false
,其他通通变true
Number(x)
:字符串转数字有一套严格规则,详情请参考ES5规范(反正转不了就变NaN
)String(x)
:万物皆可转字符串,对象会调用toString()
2. 隐式转换:偷偷摸摸的变身
这才是JS的精髓(坑)所在!你永远不知道什么时候它就给你变了:
- 四则运算 :
+
只要有一个字符串就变成拼接,其他运算符默默转数字 - 判断语句 :
if
、while
里的条件会偷偷转布尔 - 比较操作符 :
==
、>=
等会触发各种隐式转换
ToPrimitive:对象变形的终极法则
对象想转原始类型?得走ToPrimitive
流程:
- 转字符串时:先调用
toString()
,不行再调用valueOf()
- 转数字时:先调用
valueOf()
,不行再调用toString()
- 都不行?抛出
TypeError
,跟你急眼!
避坑指南:类型转换的那些坑
[] == ![]
:结果是true
!因为![]
是false
,[]
转数字是0
,0 == false
成立NaN == NaN
:结果是false
!NaN谁都不认识,包括它自己{}.toString()
:返回"[object Object]"
,而不是`