JS-怎么打印出全部字母

165 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情

前言

某个项目的需求,需要列举出全部的英文字母和数字,供用户选择使用;听上去好像挺简单的,直接手写列举出来即可。

但是,作为一个程序员,直接手写出全部字母,实在是太简单(不够装逼),于是,有了本篇文章。

思路

如果使用代码生成 0 ~ 9 的全部数字,那就十分简单,从 0 开始逐渐递增,逐个打印出来即可。

那么字符(string)能不能和数字(number)一样,通过递增,获取对应的下一个字符?

通常是不行的,因为在 js 中,字符与数字的相加,会返回字符与数字拼凑成字符串。

但是UTF-16 编码可以,编码也是数字,只要先把字符转换为编码,然后递增获取后续的字符即可,而且在 UTF-16 编码,26个英文字母是按照顺序排列的。

那么现在的问题就是怎么获取字符的 UTF-16 编码,以及怎么把编码转换为字符?

翻了翻 MDN,发现相关函数,String.fromCodePoint() 可以把编码转换为字符串,而 String.prototype.charCodeAt() 可以把字符转换为编码,这样万事俱备,可以开始撸代码。

代码

思路就和列举出数字基本一样:

  1. 把字符转换为编码;
  2. 把编码逐渐递增;
  3. 然后再把编码转换为字符,保存起来;
  4. 重复第二步,直到循环结束。
/**
 * 根据给定的字符,获取之后指定长度的字符数组
 * @param { string } startChar 指定的起始字符
 * @param { number } len 数组长度,也是需要获取的字符数量
 * @return string[]
 */
function getCharArrayFromCode (startChar, len = 0) {
  // 参数验证
  if (
    !startChar ||
    typeof startChar !== 'string' ||
    !len ||
    isNaN(len)
  ) {
    return []
  }
  // 保存结果数组
  const result = []
  // 把起始字符转换为编码
  let currentCode = startChar.charCodeAt()
  // 截止编码
  const targetLen = len + currentCode
  // 循环生成
  for (; currentCode < targetLen; currentCode++) {
    // 把编码转换为字符保存到数组中
    result.push(String.fromCodePoint(currentCode))
  }
  return result
}

测试一把:

// 从 `a` 字符开始,获取 26 个小写字母
console.log('result:', getCharArrayFromCode('a', 26))
// result: 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,z

当然,也可以打印出其他连续字符,比如拉丁文:

console.log('result:', getCharArrayFromCode('À', 100))
// result: À,Á,Â,Ã,Ä,Å,Æ,Ç,È,É,Ê,Ë,Ì,Í,Î,Ï,Ð,Ñ,Ò,Ó,Ô,Õ,Ö,×,Ø,Ù,Ú,Û,Ü,Ý,Þ,ß,à,á,â,ã,ä,å,æ,ç,è,é,ê,ë,ì,í,î,ï,ð,ñ,ò,ó,ô,õ,ö,÷,ø,ù,ú,û,ü,ý,þ,ÿ,Ā,ā,Ă,ă,Ą,ą,Ć,ć,Ĉ,ĉ,Ċ,ċ,Č,č,Ď,ď,Đ,đ,Ē,ē,Ĕ,ĕ,Ė,ė,Ę,ę,Ě,ě,Ĝ,ĝ,Ğ,ğ,Ġ,ġ,Ģ,ģ

参考:

UTF-16参照表