您好,欢迎来到伴沃教育。
搜索
您的当前位置:首页JS 进制及进制转换

JS 进制及进制转换

来源:伴沃教育


进制介绍

JS 中提供的进制表示方法有四种:二进制、八进制、十进制、十六进制。

对于数值字面量,主要使用不同的前缀来区分:

  • 二进制(Binary):取值数字 0 和 1 ;前缀 0b 或 0B
  • 八进制(Octal):取值数字 0-7 ;前缀 0o 或 0O (ES6规定)
  • 十进制(Decimal):取值数字 0-9;不用前缀
  • 十六进制(Hexadecimal):取值数字 0-9 和 a-f ;前缀 0x 或 0X

在 JS 内部的默认情况下,二进制、八进制、十六进制字面量数值都会自动转为十进制进行运算。

0x22 // 十六进制自动转为十进制 34
0b111 // 二进制自动转为十进制 7
0o33 // 27 八进制自动转为十进制 27
0x22 + 0b111 // 41 先分别自动转为十进制,后进行 + 运算
0o33 + 12 // 39 先自动转为十进制,后进行 + 运算
(0x33).toString() // '51' 先自动转为十进制,后进行 toString() 运算
(0x33).valueOf() // 51 先自动转为十进制,后进行 valueOf() 运算

除了十进制是 JS 默认的数字进制以外,其他三种进制方式平时使用较少,主要在处理 Blob 数据、字节编码或者位运算、转义字符等等时候才会碰到。

注意

在 JS 中,进制转换通常是将数字转换为字符串形式,因为直接转换为数字可能导致精度损失。例如,parseInt(0.1, 2) 和 parseInt(0.1, 16) 的结果都会是 0,因为在二进制和十六进制中,0.1 不能精确表示。

二进制、八进制、十六进制 转为 十进制

parseInt(str, radix)
  • 第一个参数 str 是需要被解析的字符串
    • 若需要解析的字符串中存在对于当前进制基数无效的字符,则会从最高位取有效字符进行转换,没有效字符则返回NaN
      parseInt('11kk', 16) // 17
      parseInt('11kk11', 16) // 17
      parseInt('kk11', 16) // NaN
      parseInt('kk', 16) // NaN
  • 第二个参数 radix 是一个进制基数,表示转换时按什么进制来理解这个字符串,默认值10,表示按十进制理解
    parseInt('1111', 2) // 15 按二进制来理解 '1111'
    parseInt('1234', 8) // 668 按八进制来理解 '1234'
    parseInt('18af', 16) // 6319 按十六进制来理解 '18af'
    parseInt('1111') // 1111 默认按十进制来理解 '1111'
    • 如果非数字,则自动转成数字,若无法转成数字则忽略该参数
      // 第二个参数无法转成数字,则忽略该参数,默认按十进制理解
      parseInt('1111', 'a') // 1111 
    • 是数字时,必须是 2-36 的整数,超出该范围,返回 NaN;若非整数,向下取整
      // 第二个参数不是 2-36 的整数
      parseInt('1111', 88) // NaN 
      parseInt('1111', 1) // NaN
      // 第二个参数非整数,转成向下取整的整数理解
      parseInt('1111', 2.2) // 15
    • 若不传入第二个参数,则 parseInt 会默认使用十进制来解析字符串。若字符串以 0x(或 0X) 开头,会被认为是十六进制数;而其他进制的字符串,0o21(八进制)0b11(二进制) 不会以该进制基数自动转换,而是得到 0。
      parseInt('0x11') // 17 ox 开头,按十六进制理解
      parseInt('0b11') // 0 
      parseInt('0o11') // 0
      parseInt('1111') // 1111 默认按十进制来理解 '1111'
  • 若第一个参数以0x(或0X)开头,第二个参数不是16,则得到0
    parseInt('0x11', 2) // 0
    parseInt('0x11', 8) // 0
    parseInt('0x11', 10) // 0
    parseInt('0x11', 16) // 17

注意

在使用 parseInt 进行进制转换时,为保证运行结果的正确性和稳定性,第二个参数不能省略

Number()

可以把字符串转为数字,支持其他进制的字符串,默认转成十进制数字。

  • 需要使用进制前缀0b(或0B)0o(或0O)0x(或0X)
    Number('0b11') // 3
    Number('0o11') // 9
    Number('0x11') // 17
  • 字符串中若存在无效的进制字符时,返回 NaN
    Number('0b12') // NaN
    Number('0o19') // NaN
    Number('0x1h') // NaN

+(一元运算符)

与 Number() 一样,可以把字符串转为数字,支持其他进制的字符串,默认转成十进制数字。

  • 需要使用进制前缀
  • 字符串中如果存在无效的进制字符时,返回 NaN
+ '0b11' // 3
+ '0o11' // 9
+ '0x11' // 17

+ '0b12' // NaN
+ '0o19' // NaN
+ '0x1g' // NaN
  • toString(): 将数字转换为指定进制的字符串形式。
  • Number.toString(): 将数字转换为指定进制的字符串形式,并返回。

十进制转换为二进制、八进制、十六进制

toString()
(11).toString(2) // '1011'
(11).toString(8) // '13'
(11).toString(16) // 'b'

// 另一种写法
Number(11).toString(8) // '13'

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- bangwoyixia.com 版权所有 湘ICP备2023022004号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务