JS数据类型转换规则

100 阅读3分钟

JS的基本数据类型

  1. Number
  2. String
  3. Boolean
  4. Null
  5. Undefined
  6. Object
  7. Symbol
  8. BigInt

其他数据类型转换为数字(Number)

  1. 隐式转换

    布尔值之间的加减

    布尔值与数字之间的加减

    布尔值与(字符串数字)之间的减法运算

    {}对象与数字之间的加减

    {}+1=1
    let obj={}
    obj+1="object Object1"
    {name:1}+1=1
    let obj2={name:1}
    obj2+1="object Object1"
    {}+"1"=1
    "1"+{}="1object Object"
    
    []==0//true
    

    通过上面的实验可以得知,声明后的变量与未声明的变量运算方式并不相同,声明后的对象会直接调用其原型上的Object.prototype.toString()方法返回一个表示该对象的字符串。

    对象与boolean之间的==运算

    例如

    []==false//true
    
  2. 显式转换

    • Number()

      空字符串,null,false会被转换为0

      带有特殊字符的字符串,undefined,{} 会被转换为NaN

      Symbol类型值会报错

      true,false会被转换为1,0

      如果转换对象是对象,则会调用对象的valueOf()方法,然后按照前面的规则进行转换

    • parseInt()

      空字符串,首字符含有非有效数字的字符会被准换为NaN

      parseInt()会依次解析字符串中每一个字符,会将前面符合数字条件的字符串转换为数字,忽略后面不符合数字字符条件的字符串。

    ECMAScript 5 不具有解析八进制字符串的能力,除非第二个参数标明要按照八进制的规则准换目标字符串

    parseInt()转换规则类似的是parseFloat(),但他们有两点不同

    1. parseFloat()总是会忽略前导0并且其没有第二个参数用来控制转换进制规则,所以其职能转换十进制
    2. 对于parseFloat()来说,第一个出现的小数点是有效字符。

    isNaN()是基于Number()

其他数据类型转换为String

  1. 隐式转换

    在js中+左右两边出现字符串则会转换为字符串拼接(因为加号只要遇见字符串就会转换为字符串拼接)

    []+0="0"
    {}+0=0
    [].toString()=""
    {}+1=1
    

    对象与对象之间的加法运算

    字符串与对象间的加法运算(而非对象与字符串间的加法运算)

  2. 显式转换

    • String()

      对于基本数据类型,值是什么样就会转换为什么样的字符串,

      对于引用数据类型,会调用其toString()方法来进行转换

    • toString()

      对象上都有toString()方法,根据其对象上的toString()规则来进行转换

      [1,2,3].toString()
      //"1,2,3"
      

      如果调用的是对象原型上的toString()方法,会返回 [object Object],Object可以被替换成其对象类型,比如Array,Date等,因为对象原型上的toString()是用来检测对象数据类型的,一般返回 object 与其构造函数的名称的组合例如 [object Array]

      例如:

      let arr=[1,2]
      Object.prototype.toString.call(arr)
      //"[object Array]"
      

其他数据类型转换为Boolean

只有0,null,undefined, NaN,""被转换为false,其他都被转换为true

==与===计算规则

  1. ==计算规则(强制转型)
    • 如果有一个数是Boolean值,则在比较相等性之前先将其转换为数值,true转换为1,false转换为0
    • 操作数是字符串和数值,会将字符串转换为数值
    • 操作数是对象和其他,调用其valueOf()方法后按照上面的规则进行比较
    • null==undefined//true
    • 如果两个操作数都是对象,则比较他们是不是一个对象,即使用的是不是一个内存空间。
  2. ===计算规则
    1. 比较其数据类型是否相同
    2. 比较其值是否相同