js类型转换

302 阅读3分钟

js属于弱类型语言,类型转换发生的非常频繁。这篇文章主要总结js的各种类型之间的转换。js包含的类型有7种,分别是Null、Undefined、String、Number、Boolean、Symbol、Object。

类型转换规则

- Boolean Number String
Null false 0 'null'
Undefined false NaN 'undefined'
Number +0、-0、NaN(false) - '1'
String ''(false) toNumber -
Boolean - false(0);true(1) 'true'/'false'
Symbol true TypeError 'Symbol()'

表格描述了值类型的转换。关于Object类型会单独讲解。

toBoolean

  • 只有null、undefined、+0、-0、NaN、''这几个值强制转换为Boolean类型时,会转换为false。其余的都会转换为true。

toNumber

三种转化方式

  • Number()
  • parseInt()
  • parseFloat()

类型转化结果

  • null转换为Number类型为0
  • undefined会转化为NaN。
  • Boolean类型的false会转化为0,true转化为1。
  • Symbol类型转化为Number会报错。
  • String类型
    • Number()
      // 1. 空字符串转化为0
      Number('') // 0
      // 2. 包含有效的Number表示格式(正负值,整数、浮点数、进制数、科学记数法),会转换为对应的十进制
      Number('-1') // -1
      Number('011') // 11
      Number('1.1') // 1.1
      Number('0xa') // 10
      Number('1e1') // 10
      // 3. 其余的会转化为NaN
      Number('aaa') // NaN
      Number('111aaa') // NaN
      
    • parseInt()
      // 1. 空字符串转化为NaN
      parseInt('') // NaN
      // 2. 从第一个非空格字符串开始,遇到第一个非数字字符为止(包括小数点)
      parseInt(' 111aaa') // 111
      parseInt('111.1') // 111
      // 3. 在不传入第二参数的情况下,只支持16进制前缀'0x',也不支持科学记数法
      parseInt('0xa') // 10
      parseInt('1e1') // 1
      // 4. 第二参数可以支持进制转换
      parseInt('AF', 16) // 175
      // 5. 其余的转换为NaN
      
    • parseFloat()
      // 1. 可以识别科学记数法及第一个有效小数点
      parseFloat('1e1') // 10
      parseFloat('12.12.3') // 12.12
      // 2. 直接把原字符串作为十进制解析,不会引入其他进制
      parseFloat('0xa') // 0
      // 3. 其余规则与parseInt()相同
      

toString

  • null => 'null'
  • undefined => 'undefined'
  • true => 'true', false => 'false'
  • 1 => '1', 100000000000000000000000 => '1e+23'(极小和极大的数字使用指数形式)

对象转换为基本类型

对象转换为基本类型通过自动调用[Symbol.toPrimitive](hint)、toString()、valueOf()三种方法实现。

[Symbol.toPrimitive](hint)

  • 优先级最高,若定义了该函数,发生类型转换时会优先调用该函数
  • hint(转换类型)取值有3个:'string','number','default'(代表不确定)
  • 必须返回一个基本类型值,否则报错

toString()、valueOf()

  • 若没有[Symbol.toPrimitive](hint)方法,则会调用toString或者valueOf方法
  • hint为string,则只会调用toString方法
  • hint为number,则会先调用valueOf方法,再根据valueOf方法的返回值判断是否需要调用toString方法。

运算符类型转换

四则运算符

只有加法运算时,其中一方是字符串类型,才会把另一个也转换为字符串类型。其他的运算只要其中一方是数字,另一方就会转换为数字。

1 + '1' // '11'
1 * '2' // 2
'a' + + 'b' // 'aNaN'

==

  • '=='和'==='运算符的区别是'=='允许在相等比较中进行强制类型转换,'==='不允许
  • 一方为数字,另一方为字符串,则将字符串转化为数字再比较
  • 如果有一方是Boolean类型,则先将其转换为数字再比较
  • null和undefined相等,与其他均不相等
    null == undefined // true
    null == false // false
    undefined == 0 // false
    
  • 一方是对象,另一方是String或者Number时,将对象按照上述对象转换为基本类型的规则转换
  • 示例
    '0' == false // true
    '0' == NaN // false
    '0' == 0 // true
    '0' == '' // false
    
    false == 0 // true
    false == '' // true
    false == [] // true
    false == {} // false
    
    '' == 0 // true
    '' == [] // true
    '' == {} // false
    
    0 == [] // true
    0 == {} // false
    0 == '\n' // true
    
    [] == ![] // true
    '' == [null] // true