【JavaScript】03. 类型转换(1)

190 阅读4分钟

这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战

类型转换(1)

01. 转换为布尔值

(1)显示转换

  • 概念:通过Boolean()转型函数,可以在任意类型的数据上调用;通过取反操作!

  • 规则:

    • 除了 undefinednullfalseNaN''0-0这些值会被转换为false,其他所有值都会被转为 true,包括所有对象
    console.log(!1); // false
    // 用两个取反符
    console.log(!!1); // true
    
    consolelog(Boolean([])); // true
    console.log(![]); // false
    
    

(2)隐式转换

  • 概念:在条件语句中,会自动执行其它类型值到布尔值的转换,即条件判断的结果是布尔值

    console.log(1 == 1); // true
    
    if (1 + 'x') {} // 等价于: 1x,所以条件为 true
    if (1 - 'x') {} // 等价于:NaN,所以条件为 false
    
    

02. 转换为数值类型

(1)显示转换

  • 概念:通过Number()parseInt()parseFloat()函数可以将非数值转换为数值类型,但他们有不一样的转换规则
Number()
  • Number()可以把其他数据类型强制转换为数字类型

  • 规则:

    • 对于布尔值:Number(true) == 1Number(false) == 0

    • 对于null和undefined:Number(null) == 0Number(undefined) == NaN

    • 对于字符串:

      // 1. 空字符串:0
      Number(''); // 0
      // 2. 只有 数值字符串 才能转
      // 数字前可以有 +、- 符号,但只能有一个
      Number('+1') // 1
      Number('-1') // -1
      Number('++1') // NaN
      
      // 可以是浮点数,但只能有一个小数点
      Number('1.1') // 1.1
      
      // 可以是十六进制,但必须以 0x 开头
      Number('0x123') // 291
      
      // 去除前后空格后,只要 包含字符,就返回NaN:NaN
      Number('str123') // NaN
      
      
    • 对于Symbol:不能把Symbol类型转换为数字类型,否则报错

    • 对于对象:会先转换为字符串,再转换为数字

    • 对于数组:只有空数组, 单数字数组才可以转换

      Number([]); // 0
      Number(['10']); // 10
      
      // 其它情况均返回 NaN
      Number(['1','2']) // NaN
      
      
    • 对于函数:Number(function(){}) == NaN

parseInt() 和 parseFloat()
  • 概念:两者都适用于对字符串的转换,使用parseInt()将字符串转换为整数类型的数值,使用parseFloat()将字符串转换为浮点类型的数值

  • 规则:

    • 第一个非空格字符开始转换
    • 如果第一个字符是数字,则可以进行转换,直到检测到其它字符,则结束
      • 特别的:+-符号也是有效的,它可以看作是数字的符号,如-1+2
      • 同样的:对于八进制、十六进制的字符串也是可以是别的
      • 而对于parseFloat,遇到第一个小数点.是有效的
    • 如果第一个字符是非数值字符、加号、减号,则返回NaN
    // 第一个非空字符为 字符,无法转换
    parseInt('str00123.23') // NaN
    
    // 第一个非空字符为 数字,可以转换
    parseInt('  12.234.123') // 12
    parseFloat('  12.234.123') // 12.234
    parseInt('+123asdasd') // 123
    
    // 十六进制
    parseInt('0x123') // 291
    
    

(2)隐式转换

  • 概念:在数学运算中,可以将其它类型的数据隐式转换为数字类型

    • 通过运算符:-*/

    • 通过添加符号:+-

      • 会默认调用ToNumber方法

      仅适用于数字字符串,如果包含其他字符则返回NaN

    let num = '123'
    console.log(+num) // 123
    console.log(-num) // -123,添加 '-' 会取反
    
    // 可再在前面添加一个 '-',注意要加括号,如果不加括号,就会变为 num 自减(虽然也可以转为数字)
    console.log(--num) // 122
    console.log(-(-num)) // 123
    
    
  • 一道题:{} + [][] + {}

    console.log({} + []) // 0
    
    console.log([] + {}) // '[object Object]'
    
    

    分析:

    • 第一道:{}会被认为是一个代码块,于是{}里面没有内容,就直接忽略了
      • 然后直接执行+[],结果为:+[] == +'' == 0
    • 第二道:就是正常的转换为字符串进行运算
      • []转换为''
      • {}转换为[object Object]

(3)其它的

  • 关于0.1+0.2 !== 0.3 的问题

    • 原因:计算机室通过二进制的方式存储、计算的,所有在进行计算时,会将0.1和0.2转换为二进制进行计算,但这两个数的二进制都是无线循环的数

    • 解决办法

      function numbersEqual(a, b) {
          return Math.abs(a, b) < Number.EPSILON
      }
      
  • 保留N位小数:.toFixed(N)

    • 注意,保留后的结果是一个字符串

03. 转换为字符串类型

(1)显示转换

  • 概念:通过内置的方法进行转换
    • .toString()方法
      • 可用于数值、字符串值、布尔值、对象
      • 但不可用于nullundefined
    • String()转型函数
      • 可以返回相应类型值的字符串
      • 规则:
        • 如果值有toString()方法,则调用该方法并返回结果
        • 如果值为null,则返回null
        • 如果值为undefined,则返回undefined

(2)隐式转换:

  • 概念:在拼接字符串时,其中有一方是字符串,则另一方会被隐式转换为字符串

    console.log('123' + 123) // 123123
    
    

(3)拓展

  • 拼接字符串——模板字符串${}+反引号

    console.log(`my name is ${name}`)
    
    

本人前端小菜鸡,如有不对请谅解