在 ECMAScript2021(ES12)版本中,String.prototype 新增了一个名为 codePoints() 的方法,用于返回一个字符串中的 Unicode 码点序列。此方法可以很方便地取得某个字符串中的字符正整数代码值,从而在处理国际化、文本处理和符号分类等方面提供了更多的可能性。
方法语法
String.prototype.codePoints()
方法返回值
返回值为一个迭代器对象,包含了字符串中的所有 Unicode 码点值。
方法示例
const str = "a𝌆"; const iterator = str.codePoints(); console.log(iterator.next().value); // 97 console.log(iterator.next().value); // 119558
在上面的示例中,我们可以看到:通过 codePoints() 方法,我们取得了字符串 a𝌆
中所有字符的 Unicode 码点。其中,“a”的 Unicode 码点是 97,而“𝌆”的 Unicode 码点值则是 119558。
此外,在针对一些特殊字符时,我们也可以进一步利用 codePoints() 方法来处理字符串,以方便地处理其与其它字符串的比较或转换。比如,当我们需要比较两个字符串时,可以基于它们的 Unicode 码点进行比较。因为字符串内存储时实际是以 UTF-16 编码存储,在某些情况下,一个字符串可能包含多个 Unicode 码点。此时,我们可以使用 codePoints() 方法将字符串拆分成最小的字符片段,以便于对这些字符进行更精确的操作。
深度解析
普通的charCodeAt() 方法
在 JavaScript 中,我们经常使用 charCodeAt() 方法获取某个字符串中的 Unicode 码点值。不过,与 codePoints() 方法不同的是,charCodeAt() 方法只能获取单个字符的 Unicode 码点。
比如,如下示例代码,其中为了计算字符串 😂hello
的长度,我们需要获得字符串中每个字符的Unicode 码点。我们看到,在计算 “😂”的Unicode码点时,只能通过 charCodeAt() 方法分别获取高位和低位的值,再通过计算得到其Unicode 码点值:0x1F602。而通过 codePoints() 方法,则能一步到位地得到“😂”字符的Unicode 码点值。
-- -------------------- ---- ------- ----- --- - ---------- --- --- - -- --- ---- - - -- - - ----------- ---- - ----- ---- - ------------------ -- ----- -- ------ -- ---- -- ------- - -- ---- --------- -- ----------------- - -- -- ------ -- ---------------- - -- -- ------- - -- --- --------- ---- ------ - - ---- - ------ - - ----------------- -- -
字符集合与长度的问题
在使用 JavaScript 处理 Unicode 字符串时,还需要考虑到字符集合与长度的问题。如果只是简单地使用 charCodeAt 函数处理字符串,计算字符串长度的时候,Unicode 字符可能被简单地看成是由两个 16 位的代理项表示并计算,从而产生了误差和错误的结果。而通过 codePoints() 方法,则能够清晰地分辨每个 Unicode 字符,并正确地计算字符串的长度。
案例分析:处理 emoji 表情
再看一个案例,来看一下 ES12 中 codePoints() 方法的应用:
-- -------------------- ---- ------- -- ----------------------- ----- -- -------- ------------------ - ----- -------- - ----------------- --- ------ - --- -------- - -- ----- - --------- - ---------------------- - - -- - ------------------------------- ----- ----- - --------- --- -------- -- --------- --- ------- -- --------- --- -------- -- --------- --- -------- -- ------- - ------ -- ------ - ---- - ------ -- ------------------------------- - - ------ ------- - --------------------------------- --- --------
输出结果为:What's up? *** ***
。
在上面的示例代码中,我们看到,通过 codePoints() 方法,我们可以便捷地获取到字符串中每个 Unicode 码点值,并进行比较、替换等操作。以此,我们可以很容易地对一些特定的字符进行敏感识别等操作,更好地满足一些特定场合下的需求。
总结
综上所述,ES12 中的 String.prototype.codePoints() 方法为我们提供了方便、安全的字符处理方式,使我们可以轻松获得 Unicode 码点,保护字符串的双字节字符平面(BMP)不被拆分,并提供了根据 Unicode 码点而不是代码单元获取字符的另一种方法。在日常的前端开发中,只要我们需要处理字符级别的操作,那么这个新进化的工具一定会帮助我们事半功倍。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645d9bd0968c7c53b0005f2c