JavaScript类型转换(四)——总结
这是JavaScript类型转换系列文章的第四篇,作个总结。
引用类型转换为字符串或者数字的规则
- 引用类型有定义
Symbol.toPrimitive方法,用它的返回值做结果; - 否则,如果没有指定转换方向,则指定转换方向为
number; - 引用类型上的
toString和valueOf函数的结果作为备选,转换方向影响它俩的优先顺序。
由此我们知道:
- 通过定义引用类型的
Symbol.toPrimitive方法,可以自由设置其如何做类型转换 - 引用类型转换为基本类型倾向于数字方向
内置引用类型的toString和valueOf函数返回值
- 多数
valueOf函数返回引用类型自身,多数toString返回对应的字符串 Date的valueOf返回时间戳,是数字类型Array的toString返回的是方括号包裹的数组元素拼接成的字符串(用逗号分隔)
转换为字符串的规则
- 特殊值转换为对应的字符串
undefinednulltruefalseNaN-0Infinity-Infinity
Symbol转换为描述字符串BigInt转换为对应10进制字符串,不包括末尾的字母n- 数字都转换为对应10进制字符串,以下情况特殊:
- 结果舍弃为0的小数部分
- 小数部分超过6位,结果为科学计数法字符串
- 整数部分超过21位,结果为科学计数法字符串
- 引用类型,执行其ToPrimitive流程,转换方向为string
转换为数字的规则
- Symbol 不能转换为数字,会报错
- Bigint 转换为对应数字,但可能丢失精度?
- 布尔值
true->1false->0
- 特殊值
null->0undefined->NaN
- 字符串
- 转换前剔除头尾的空字符串,如果有多个前导
0只保留一个 ""->0- 无法转换为数字的字符串 ->
NaN - 其它情况 -> 对应的字符串
- 转换前剔除头尾的空字符串,如果有多个前导

转换为布尔值的规则
转换为false的情况
""nullundefined0-00nNaNdocument.all
其它情况都转换为true
显示类型转换
哪些操作会触发显示类型转换?带有明确转换方向的方法:
String() 、toString()、 Number()、 Object()、 parseInt()、 parseFloat() Boolean()
隐式类型转换
| 运算 | 方向 | 备注 |
|---|---|---|
| 算数运算 | 数字 | BigInt不能与number混合运算? |
| 字符串运算 | 字符串 | 二元+操作数包括字符串 |
| 关系运算 | 数字 | 条件:操作数不同为数字或者不同为字符串;==和!=的操作数不同为引用类型 |
| 逻辑运算 | 布尔值 | 条件:!的操作数不是布尔值;|| 和&&的第一个操作数不是布尔值 |
| 条件判断 | 布尔值 | |
| 用数字访问数组项 | 字符串 | |
| 参数类型适配 | 具体情况具体分析 |
运算顺序
具体的优先级和结合性可以参考前文:主要运算符优先级和结合性。
大致运算顺序
括号分组先执行
成员访问调方法
单目运算右结合
幂乘加减后移位
比较相等位运算
逻辑与先逻辑或
条件运算和赋值
最后垫底是逗号
易错点
逻辑与比逻辑或更优先
逻辑取反(!)优先级很高
条件运算符(三元运算)是右结合