「ES12」中的 String.prototype.codePoints()

阅读时长 5 分钟读完

在 ECMAScript2021(ES12)版本中,String.prototype 新增了一个名为 codePoints() 的方法,用于返回一个字符串中的 Unicode 码点序列。此方法可以很方便地取得某个字符串中的字符正整数代码值,从而在处理国际化、文本处理和符号分类等方面提供了更多的可能性。

方法语法

String.prototype.codePoints()

方法返回值

返回值为一个迭代器对象,包含了字符串中的所有 Unicode 码点值。

方法示例

在上面的示例中,我们可以看到:通过 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

纠错
反馈