JS(8)数据类型转换 and 隐式类型转换

90 阅读3分钟

数据类型转换【string、number、boolean】

<1> ==> string

三种方法:toString()String()+操作符

  • null 、undefined 没有 toString() 方法 ,如果没有就用 String()
  • 用 + 操作符给一个值加上一个空字符串 "" ,就能得到该值的字符串形式
null + "" = "null"
2 + "" = "2"

<2> ==> number

三种方法:Number()parseInt()parseFloat() 【后两个只适用于string-->number】

  • Number() 适用于任何数据类型
    • boolean: true ---> 1 , false ---> 0
    • unll ---> 0
    • undefined ---> NaN
    • string
    - 如果字符串中的字符只有数值/"+"/"-",就会返回该数值的十进制形式
      Number("011") ---> 11 , Number("-123") ---> -123
    - 如果字符串是有效的十六进制格式,就会返回该十六进制对应的十进制数字
      Number("0xf123") ---> 61731
    - 如果字符串为空字符串 "" ,则返回 0
      Number("") ---> 0
    - 如果字符串还包含其他字符,eg:"a" ,则返回 NaN
      Number("211a") ---> NaN
    
    • object
    - 会先调用 valueOf() 方法【拆箱】,如果返回的是 number 类型的,直接返回;
    - 如果不是,则会再调用 toString() 转化为字符串,然后再调用**Number()**按照字符串的规则进行转换!!!
    

补: valueOf() 方法:

该方法返回对象的原始值,eg: 像 number、string、boolean 这些,有自己的原始值包装类型!!那么在它们身上调用 valueOf() 就会返回它们的原始值类型。如果对象没有原始值,就返回该对象本身!!当然可以重写该方法,返回自己想返回的值!!!

补: toString() 方法:

 console.log({1:1}.toString())
 console.log([1,2].toString())
 console.log(new Date().toString())

2419.webp

  • parseInt(str , [ n ] ) 【 第一个不是空格or数字or(+/-) 直接 NaN 】

    • 从字符串的第一个非空格字符开始,如果第一个非空格字符不是数值/符号+/符号- , 直接返回 NaN

    • 空字符串""也会返回NaN

       parseInt("") // NaN
      
    • 会从第一个可转化的字符开始,一直到碰到非数值字符,就会停止转换!!

       parseInt("1234BLUE")  // 1234
      
    • 只能识别整数部分

        paseInt("22.5")  // 22
      
    • 可以识别不同的整数格式,给第二个参数传入,按照多少进制的格式即可

        parseInt("AF" , 16) //175
      
  • parseFloat(str) string ----> number 【只能识别十进制的字符串】

    • 跟上述的 parseInt() 类似,只是只能识别十进制 ,且可以识别小数部分
parseInt("1234BLUE")  // 1234
paseInt("22.5")  // 22.5

总的来说: Number() 和 parseInt() 的区别:

  • Number() 是只要包含非数值的且不是+ 、- 、" "的字符 的就会 ===> NaN
  • parseInt()是只要开头有可以转化为数字的(从非空字符开始)就行,转化到非数值停止
  • Number("") = 0 , Number(" ") = 0
  • parseInt("") = NaN ,parseInt(" ") = NaN

<3> ==> boolean

假值的类型:

  • undefined
  • null
  • 0 、NaN 、+0 、-0
  • ""

注意:

  • {} 转为布尔值为 true
  • " " 为 true

隐式类型转换

JS 中的隐式类型转换一般发生在+ - * / 以及 == > < ! 操作符之间。而这些操作符只能操作原始值类型,所以如果有对象,就会先调用 valueOf() 方法,如果返回的是原始值类型,就直接返回,如果不是,就接着调用 toString() 方法!!!

<1> + 加 操作符 【主 string】

<2>- * /  减乘除 操作符 【主 number】

<3>>= <= 比较操作符 【主 number】

  • string > string 不用进行转换,直接按顺序一个一个字符比较 ASCII 码的值即可!!!

<4> !=== 操作符会进行类型转换 【主 number】

  • string == string 不用进行转换,直接按顺序一个一个字符比较 ASCII 码的值即可!!!

  • 有 NaN ,就直接返回 false

<5> !===== 不会进行类型转换

  • 类型不一样就直接返回 false
var a = {};
a > 2  // false

// 其中涉及的隐式转换过程如下: 【> 操作符 主number 】

- 对于 {} ,先调用 {}.valuef() ,由于{}不存在与之对应的原始值类型(即没法拆箱),
  所以就会返回该对象本身,即 {}
- 然后再调用 {}.toString() 方法,由于 {} 是 Object 的实例,所以此处的 toString() 方法,
  就是Object原型上的toString()方法(没有经过重写的),所以就会返回字符串"[object Object]"
- 再把"[object Object]"转换为 number 类型为 NaN 
- NaN > 2  // false

2136.png