这个知识点还是有一些繁琐。需要认真理解并记忆
ToString
ToString负责处理非字符串到字符串的强制类型转换
基本类型的值转换为字符串
null 转化为'null' undefined 转化为'undefined' true 转化为'true' 数字的字符串转化规则遵守通用规则
对于普通对象来说,如果没有自定义toString()方法,则返回
[object Object]
,如果有自己的toSting方法,就会调用该方法并返回值数组的toString()返回所有单元字符串化后用’,’连接起来。
[a,b,c].toString() //结果为'a,b,c'
ToNumber
基本类型的值转化为数字
null 转化为0 undefined 转化为 NaN true 转化为1,false转化为 0 字符串的处理遵循通用规则
对象或数组首先会被转化为响应的基本类型,如果返回的是非数字的基本类型,再按照以上规则进行转换,其中对象转换为基本类型时会使用ToPrimitive操作。
ToPrimitive
ToPrimitive操作会首先检查对象是否有valueOf()方法,如果有并且返回基本类型的值,就调用该方法进行类型转换,如果没有就使用toSting类型的返回的值。
如果valueOf()和toString均不返回基本类型的值,就会产生TypeError错误
如果没有对对象的valueOf()和toString()方法重写,那么:
对象的valueOf()返回对象本身,toString()返回[object Object]
数组的valueOf()返回数组本身,toSring()返回所有单元字符串化以后再用’,’连接。
ToBoolean
null
转为false
undefined
转为false
- 除了
''
以外都转为true
- 除了
0
和NaN
以外都转为true
- 所有对象都转为
true
隐式类型转换
字符串和数字之间的隐式类型转换
数字转为字符串
+
运算符即能够用于数字相加,也可以用于字符串拼接,简单理解应当是如果+
运算符的操作数其中一个是字符串或者可以通过ToPrimitive(针对对象,也包括数组)转为字符串的则执行字符串的拼接,负责执行数字相加
字符串转化为数字
-
,*
,/
都可以用来将字符串转化为数字,其规则和+相似。
隐式类型转化为布尔值
以下几种情况会发生隐式类型转换为布尔值
if()
条件判断语句for()
中的条件判断语句while()
和do...while()
中的条件判断语句?:
三目运算符中的条件判断语句- 逻辑运算符
||
和&&
左边的操作数
||和&&
&&
和||
运算符并不一定返回布尔值,他实际返回的是两个操作数中的一个的值
&&
和||
首先对第一个操作数进行条件判断,如果第一个操作数不是布尔类型的值,则会被转为布尔类型的值,再进行下面的判断
对于||
而言,如果第一个操作数条件判断结果为true,则返回第一个操作数,否则,返回第二个操作数
对于&&
而言,如果第一个操作数条件判断结果为false,则反返回第一个操作数,否则,返回第二个操作数。
强制类型转换:==
和===
正确理解:==
允许在相等比较中进行强制类型转换,而===
不允许
- 字符串和数字之间的相等比较:将字符串转换为数字进行相等比较
- 其他类型与布尔值之间的相等比较:将布尔值转换为数字进行比较
- 对象和非对象之间的相等比较:
- 如果x是数字或者字符串,y是对象,则返回
x==ToPrimitive(y)
- 如果x是对象,y是字符串或者数字,则返回
ToPrimitive(x)==y
- 如果x是数字或者字符串,y是对象,则返回
Tips:
之所以 typeof null === ‘object’是因为在JavaScript中不同的对象在底层都是表示为二进制,而二进制前三位都为0的话会被判断为object类型,null的二进制全是0,所以在执行typeof时会返回‘object’