# 1.JS中的进制表示
JavaScript
中提供的进制表示方法有四种:
- 十进制
- 二进制
- 八进制
- 十六进制
对于数值字面量,可以使用不同的前缀来表示:
- 十进制(
Decimal
):取值数字0-9
,不用前缀。 - 二进制(
Binary
):取值数字0
和1
,前缀0b
或者0B
。 - 八进制(
Octal
):取值数字0-7
,前缀0o
或者0O
。 - 十六进制(
Hexadecimal
):取值数字0-9
及a-f
,前缀0x
或者0X
。
譬如同一个数字在不同进制下的表示是这样的:
// 1.十进制
console.log(2022)
// 2.二进制
console.log(0b11111100110)
// 3.八进制
console.log(0o3746)
// 4.十六进制
console.log(0x7e6)
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))
2
3
4
5
6
# 2-2.其他进制转换十进制
将其他进制转换成十进制,可以使用如下 3
种方法:
window.parseInt()
Number()
+
(一元运算符)
# 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
2
3
radix
参数也是一个 [2,36]
之间的整数 (通常认为这个参数的默认值为 10
, 但是建议使用时总是显示的指定),表示参数 string
的基数。
如果第二个参数是 0
、undefined
(等同于不传使用默认值)和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
*/
})
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
2
3
# 2-2-3.+运算符
+
与 Number()
的操作类似,都可以将其他进制的数字或字符串转换成十进制数字。
转换失败时,返回 NaN
。
同样要注意的一点,需要使用进制前缀。
console.log(+0x7e6) // 2022
console.log(+'0x7e6') // 2022
console.log(+'0b7e6') // NaN
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'
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
2
3
4
5
6
7
# 5.十六进制转换utf-8
我们现在来把 16
进制字符串转化为 utf-8
下的字符。
var hexString = '65e6'
console.log(String.fromCodePoint(window.parseInt(hexString, 16))) // '旦'
2
3
浮点数 →