# 1.JS中的进制表示

JavaScript 中提供的进制表示方法有四种:

  1. 十进制
  2. 二进制
  3. 八进制
  4. 十六进制

对于数值字面量,可以使用不同的前缀来表示:

  1. 十进制(Decimal):取值数字 0-9,不用前缀。
  2. 二进制(Binary):取值数字 01,前缀 0b 或者 0B
  3. 八进制(Octal):取值数字 0-7,前缀 0o 或者 0O
  4. 十六进制(Hexadecimal):取值数字 0-9a-f,前缀 0x 或者 0X

譬如同一个数字在不同进制下的表示是这样的:

// 1.十进制
console.log(2022)
// 2.二进制
console.log(0b11111100110)
// 3.八进制
console.log(0o3746)
// 4.十六进制
console.log(0x7e6)
1
2
3
4
5
6
7
8

# 2.JS中的进制转换

# 2-1.十进制转换其他进制

将十进制转换成其他进制,可以使用 Number.prototype.toString 方法。

# 2-1-1.Number.prototype.toString

Number.prototype.toString() 方法可以将十进制数字转换为其他进制。

toString 方法可以接受一个参数(可选), 默认为 10, 表示输出的进制, 进制限制在 [2,36] 之间的整数, 如果不在范围内的参数会抛出一个 RangeError

该方法返回一个以限定进制表示的字符串

var number = 2022
console.log(number.toString(2)) // '11111100110'
console.log(number.toString(8)) // '3746'
console.log(number.toString(16)) // '7e6'
// 超出进制表示的时候 会报错 Uncaught RangeError: toString() radix argument must be between 2 and 36
console.log(number.toString(37))
1
2
3
4
5
6

# 2-2.其他进制转换十进制

将其他进制转换成十进制,可以使用如下 3 种方法:

  1. window.parseInt()
  2. Number()
  3. +(一元运算符)

# 2-2-1.window.parseInt()

window.parseInt(string, radix) 方法可用于将字符串转换为指定进制的数字表示。

如果参数 string 包含对于指定进制无意义的字符,则从最高位开始,只返回可以转换的数值。

如果参数 string 的第一个字符不能转化为数字(后面跟着数字的正负号除外),返回 NaN

譬如:

console.log(parseInt('7e6')) // 7
console.log(parseInt('e6')) // NaN
console.log(parseInt('7e6', 16)) // 2022
1
2
3

radix 参数也是一个 [2,36] 之间的整数 (通常认为这个参数的默认值为 10, 但是建议使用时总是显示的指定),表示参数 string 的基数。

如果第二个参数是 0undefined(等同于不传使用默认值)和null,则直接忽略, 还是以 10 作为基数。

parseInt 在正常情况工作的情况会返回一个整数, 在计算出错的时候通常返回 NaN, 但不会报错。

分析一道很经典的面试题 [1, 2, 3].map(parseInt):

// [1, 2, 3].map(parseInt) 实际上等价于:
[1, 2, 3].map((item, index) => {
  parseInt(item, index)
  /*
    也就是:
    parseInt(1, 0) => 10进制下的1 依然是1
    parseInt(2, 1) => 没有1进制 执行出错 结果为NaN
    parseInt(3, 2) => 有2进制 但2进制下不可能有3 只有0和1 执行出错 结果为NaN
  */ 
})
1
2
3
4
5
6
7
8
9
10

所以 [1, 2, 3].map(parseInt) 的执行结果是 [1, NaN, NaN]

# 2-2-2.Number()

Number() 方法可以将其他进制的数字或字符串转换成十进制数字。

转换失败时,返回 NaN

要注意的一点,需要使用进制前缀

console.log(Number(0x7e6)) // 2022
console.log(Number('0x7e6')) // 2022
console.log(Number('0b7e6')) // NaN
1
2
3

# 2-2-3.+运算符

+Number() 的操作类似,都可以将其他进制的数字或字符串转换成十进制数字。

转换失败时,返回 NaN

同样要注意的一点,需要使用进制前缀

console.log(+0x7e6) // 2022
console.log(+'0x7e6') // 2022
console.log(+'0b7e6') // NaN
1
2
3

# 3.十六进制转换Unicode

var str = '旦'
// 1.将字符串转化为16进制
var hex = str.codePointAt().toString(16)
console.log(hex) // '65e6'
// 其实对应的unicode编码就是'\u65e6'
console.log('\\u' + '65e6') // '\u65e6'
1
2
3
4
5
6

# 4.Unicode转换十六进制

Unicode 编码通常以U+ 或者 \u开头,后接十六进制表示。

// 以 'U+' 开头为例:
var unicode = 'U+65e6'
// 16进制字符串
var hexStr = unicode.slice(2)
// 将16进制字符串转化为十进制
var decimal = window.parseInt(hexStr, 16)
console.log(decimal) // 26086
1
2
3
4
5
6
7

# 5.十六进制转换utf-8

我们现在来把 16 进制字符串转化为 utf-8 下的字符。

var hexString = '65e6'

console.log(String.fromCodePoint(window.parseInt(hexString, 16))) // '旦'
1
2
3
Last Updated: 3/18/2022, 12:46:43 PM