《你不知道的 JavaScript(中卷)》和各个大佬的文章所归纳的总结,如有异议按你的理解为主
将值从一种类型转换为另一种类型称为类型转换 在 JavaScript
中进行类型转换时,根据调用形式的不同可以分为以下两种:
在了解类型转换前我们需要知道 JavaScript
的 抽象操作 (类型转换规则)
抽象操作 是指仅供内部使用的操作
ToPrimitive
将引用类型转换成相应的基本类型值ToString
将非字符串值转换成字符串ToBoolean
将非布尔值转换成布尔值ToNumber
将非数字值转换成数字值ToPrimitive
用来处理引用类型到基本类型的类型转换
Symbol.toPrimitive()
TypeError
错误valueOf()
toString()
toString()
TypeError
错误Object.create(null)
创建的对象没有原型,即不存在 valueOf()
和 toString()
,当对其进行类型转换时会抛出 TypeError
错误valueOf()
和 toString()
的调用顺序会根据转换目标不同去做相应调整
valueOf()
再调用 toString()
toString()
再调用 valueOf()
ToString
用来处理非字符串到字符串的类型转换
undefined
=> 'undefined'
null
=> 'null'
true
=> 'true'
false
=> 'false'
number
+0 0 -0
=> '0'
Infinity
=> 'Infinity'
ToPrimitive
逻辑将其转换成基本类型,如果返回的基本类型不是字符串,再遵循以上规则进行转换ToBoolean
用来处理非布尔值到布尔值的类型转换,在 JavaScript
中,布尔类型分为真值(true
)和假值(false
)
false
的值false
)
undefined
null
false
+0 0 -0 NaN
''
true
)ToNumber
用来处理非数字值到数字值的类型转换
undefined
=> NaN
null
=> 0
true
=> 1
false
=> 0
string
''
) => 0
NaN
ToPrimitive
逻辑将其转换成基本类型,如果返回的基本类型不是数值,再遵循以上规则进行转换显式类型转换是指显式的去调用类型转换方法
Boolean()
Number()
parseInt()
parseFloat()
String()
Number()
转换的是整个值parseInt()
和 parseFloat()
转换的是部分值,是对字符串逐个进行解析和转换,如果传入的参数不是字符串,会先对其进行字符串的转换隐式类型转换是指在执行过程中,当实际操作的值与 JavaScript
内部期望得到的值不同时,就会对其做隐式类型转换(即不易察觉的类型转换) 在 JavaScript
中有以下场景会发生隐式类型转换
+ - * /
)==
)> < >= <=
)&& ||
)if()
while()
-
(减) *
(乘) /
(除) 运算符: 先对操作数做 ToNumber
处理再执行运算+
(加) 运算符
ToNumber
处理string
时,将另一个操作数做 ToString
处理再执行字符串拼接number
另一个操作数为基本类型时,将基本类型做 ToNumber
处理再执行运算number
另一个操作数为引用类型时,都会先做 ToString
处理再执行字符串拼接boolean
与其它类型进行比较时,将 boolean
做 ToNumber
处理string
与 number
进行比较时,将 string
做 ToNumber
处理undefined
与 null
比较时返回 true
undefined
null
与其它类型的比较时都返回 false
引用类型
与 基本类型
进行比较时,将 引用类型
做 ToPrimitive
处理引用类型
与 引用类型
比较时,直接判断引用地址是否一致ToPrimitive
处理string
类型时进行 Unicode 编码
大小比较ToNumber
处理,再进行数值大小比较逻辑操作符与条件判断语句中都是做 ToBoolean
处理