JavaScript类型转换(四)——总结

这是JavaScript类型转换系列文章的第四篇,作个总结。

引用类型转换为字符串或者数字的规则

  1. 引用类型有定义Symbol.toPrimitive方法,用它的返回值做结果;
  2. 否则,如果没有指定转换方向,则指定转换方向为number
  3. 引用类型上的toStringvalueOf函数的结果作为备选,转换方向影响它俩的优先顺序。

由此我们知道:

  • 通过定义引用类型的Symbol.toPrimitive方法,可以自由设置其如何做类型转换
  • 引用类型转换为基本类型倾向于数字方向

内置引用类型的toStringvalueOf函数返回值

  • 多数valueOf函数返回引用类型自身,多数toString返回对应的字符串
  • DatevalueOf返回时间戳,是数字类型
  • ArraytoString返回的是方括号包裹的数组元素拼接成的字符串(用逗号分隔)

转换为字符串的规则

  • 特殊值转换为对应的字符串
    • undefined
    • null
    • true
    • false
    • NaN
    • -0
    • Infinity
    • -Infinity
  • Symbol转换为描述字符串
  • BigInt转换为对应10进制字符串,不包括末尾的字母n
  • 数字都转换为对应10进制字符串,以下情况特殊:
    • 结果舍弃为0的小数部分
    • 小数部分超过6位,结果为科学计数法字符串
    • 整数部分超过21位,结果为科学计数法字符串
  • 引用类型,执行其ToPrimitive流程,转换方向为string

转换为数字的规则

  • Symbol 不能转换为数字,会报错
  • Bigint 转换为对应数字,但可能丢失精度?
  • 布尔值
    • true -> 1
    • false -> 0
  • 特殊值
    • null -> 0
    • undefined -> NaN
  • 字符串
    • 转换前剔除头尾的空字符串,如果有多个前导0只保留一个
    • "" -> 0
    • 无法转换为数字的字符串 -> NaN
    • 其它情况 -> 对应的字符串

转换为数字的规则

转换为布尔值的规则

转换为false的情况

  • ""
  • null
  • undefined
  • 0
  • -0
  • 0n
  • NaN
  • document.all

其它情况都转换为true

显示类型转换

哪些操作会触发显示类型转换?带有明确转换方向的方法:

String()toString()Number()Object()parseInt()parseFloat() Boolean()

隐式类型转换

运算 方向 备注
算数运算 数字 BigInt不能与number混合运算?
字符串运算 字符串 二元+操作数包括字符串
关系运算 数字 条件:操作数不同为数字或者不同为字符串;==!=的操作数不同为引用类型
逻辑运算 布尔值 条件:!的操作数不是布尔值;||&&的第一个操作数不是布尔值
条件判断 布尔值
用数字访问数组项 字符串
参数类型适配 具体情况具体分析

运算顺序

具体的优先级和结合性可以参考前文:主要运算符优先级和结合性

大致运算顺序

括号分组先执行

成员访问调方法

单目运算右结合

幂乘加减后移位

比较相等位运算

逻辑与逻辑或

条件运算和赋值

最后垫底是逗号

易错点

逻辑与比逻辑或更优先

逻辑取反(!)优先级很高

条件运算符(三元运算)是右结合