类型转换

这个知识点还是有一些繁琐。需要认真理解并记忆

ToString

ToString负责处理非字符串到字符串的强制类型转换

  1. 基本类型的值转换为字符串

    null 转化为'null'
    undefined 转化为'undefined'
    true 转化为'true'
    数字的字符串转化规则遵守通用规则
    
  2. 对于普通对象来说,如果没有自定义toString()方法,则返回[object Object],如果有自己的toSting方法,就会调用该方法并返回值

  3. 数组的toString()返回所有单元字符串化后用’,’连接起来。

    [a,b,c].toString() //结果为'a,b,c'
    

ToNumber

  1. 基本类型的值转化为数字

    null 转化为0
    undefined 转化为 NaN
    true 转化为1,false转化为 0
    字符串的处理遵循通用规则
    
  2. 对象或数组首先会被转化为响应的基本类型,如果返回的是非数字的基本类型,再按照以上规则进行转换,其中对象转换为基本类型时会使用ToPrimitive操作。

ToPrimitive

ToPrimitive操作会首先检查对象是否有valueOf()方法,如果有并且返回基本类型的值,就调用该方法进行类型转换,如果没有就使用toSting类型的返回的值。

如果valueOf()和toString均不返回基本类型的值,就会产生TypeError错误

如果没有对对象的valueOf()和toString()方法重写,那么:

对象的valueOf()返回对象本身,toString()返回[object Object]

数组的valueOf()返回数组本身,toSring()返回所有单元字符串化以后再用’,’连接。

ToBoolean

  1. null转为false
  2. undefined转为false
  3. 除了''以外都转为true
  4. 除了0NaN以外都转为true
  5. 所有对象都转为true

隐式类型转换

字符串和数字之间的隐式类型转换

数字转为字符串

+运算符即能够用于数字相加,也可以用于字符串拼接,简单理解应当是如果+运算符的操作数其中一个是字符串或者可以通过ToPrimitive(针对对象,也包括数组)转为字符串的则执行字符串的拼接,负责执行数字相加

字符串转化为数字

-,*,/都可以用来将字符串转化为数字,其规则和+相似。

隐式类型转化为布尔值

以下几种情况会发生隐式类型转换为布尔值

  1. if()条件判断语句
  2. for()中的条件判断语句
  3. while()do...while()中的条件判断语句
  4. ?:三目运算符中的条件判断语句
  5. 逻辑运算符||&&左边的操作数

||和&&

&&||运算符并不一定返回布尔值,他实际返回的是两个操作数中的一个的值

&&||首先对第一个操作数进行条件判断,如果第一个操作数不是布尔类型的值,则会被转为布尔类型的值,再进行下面的判断

对于||而言,如果第一个操作数条件判断结果为true,则返回第一个操作数,否则,返回第二个操作数

对于&&而言,如果第一个操作数条件判断结果为false,则反返回第一个操作数,否则,返回第二个操作数。

强制类型转换:=====

正确理解:==允许在相等比较中进行强制类型转换,而===不允许

  1. 字符串和数字之间的相等比较:将字符串转换为数字进行相等比较
  2. 其他类型与布尔值之间的相等比较:将布尔值转换为数字进行比较
  3. 对象和非对象之间的相等比较:
    1. 如果x是数字或者字符串,y是对象,则返回 x==ToPrimitive(y)
    2. 如果x是对象,y是字符串或者数字,则返回ToPrimitive(x)==y

Tips:

之所以 typeof null === ‘object’是因为在JavaScript中不同的对象在底层都是表示为二进制,而二进制前三位都为0的话会被判断为object类型,null的二进制全是0,所以在执行typeof时会返回‘object’


  转载请注明: TomoFur 类型转换

  目录