利用 JS 打印 a-z
大约 1 分钟
缘起:在看 Ant Design 源码的时候,看到一个有趣的案例,是连续打印字母 a-z。
const a_z = [...Array(25)].map((_, i) => (i + 10).toString(36))
通常做法是利用String.fromCharCode()
传入一个指定的 Unicode 值,然后返回一个字母字符串,连续打印则为:
const upBaseCode = 65 // 大写基数 [65, 90]
const lowerBaseCode = 97 // 小写基数 [97, 122]
for (let i = 0; i < 26; i++) {
console.log(String.fromCharCode(i + lowerBaseCode)) // 小写
console.log(String.fromCharCode(i + upBaseCode)) // 大写
}
但还有另外一种做法,利用 Number.prototype.toString(radix)
通常,Number 转字符串不需要传参数,但是也可以传一个 radix
,表示转换进制。
十进制 | 二进制 | 八进制 | 十六进制 |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 |
2 | 10 | 2 | 2 |
3 | 11 | 3 | 3 |
4 | 100 | 4 | 4 |
5 | 101 | 5 | 5 |
6 | 110 | 6 | 6 |
7 | 111 | 7 | 7 |
8 | 1000 | 10 | 8 |
9 | 1001 | 11 | 9 |
10 | 1010 | 12 | A |
11 | 1011 | 13 | B |
12 | 1100 | 14 | C |
13 | 1101 | 15 | D |
14 | 1110 | 16 | E |
15 | 1111 | 17 | F |
上表中可以看到十六进制用到了字母 A 到 F,而三十六进制则会用到 A 到 Z。因此,可以利用该特性进行转换:
for (let i = 0; i < 26; i++) {
console.log((10 + i).toString(36)) // 36 进制中 10 开始为字母, 结果为小写 a-z
console.log((10 + i).toString(36).toUpperCase()) // 结果为大写 A-Z
}
因此,以下的代码便不难理解了:
const a_z = [...Array(25)].map((_, i) => (i + 10).toString(36))
// ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y']
Loading...