JavaScript中的String.prototype.charCodeAt方法

在JavaScript中,字元串是不可變的,而且一旦創建就不能更改它們的內容。不過,有些時候我們需要遍歷字元串並訪問每個字元的Unicode碼點。這時候就用到了String.prototype.charCodeAt方法。

一、codePointAt()方法的介紹

String.prototype.charCodeAt方法返回一個在指定位置的字元的Unicode值。Unicode碼點指的是每個字元具有獨特的數字,代表Unicode中的特定字元。在ES6引入codePointAt方法之前,charCodeAt方法只返回低16位的值, 所以不能完全表示UTF-16編碼的所有字元。

這就是ES6中引入codePointAt方法的原因,它可以返回完整的Unicode碼點,具有更好的字元支持和互操作性。

let str = 'Hello World!';

console.log(str.charCodeAt(0)); // 72
console.log(str.charCodeAt(1)); // 101
console.log(str.charCodeAt(6)); // 32

charCodeAt方法還可以接受第二個可選參數,指定從哪個位置開始查找字元的Unicode碼點,默認值為0。例如:

let str = 'Hello World!';

console.log(str.charCodeAt(0)); // 72
console.log(str.charCodeAt(1, 2)); // 101
console.log(str.charCodeAt(6)); // 32

二、codePointAt()方法的使用示例

除了返回單個字元的Unicode碼點,codePointAt方法還可以返回完整字元的Unicode碼點。

let str = '?是一隻狗';

console.log(str.charCodeAt(0)); // 55361
console.log(str.charCodeAt(1)); // 57213
console.log(str.charCodeAt(2)); // 26102
console.log(str.charCodeAt(3)); // 32
console.log(str.charCodeAt(4)); // 34892
console.log(str.charCodeAt(5)); // 19968
console.log(str.charCodeAt(6)); // 22303

在上述示例中,我們可以看到,只有使用codePointAt方法才能正確地解析高代理項和低代理項,使得我們可以訪問整個字元序列,而不僅僅是每個單獨字元的低16位。

三、codePointAt()方法的使用注意事項

需要注意的是,codePointAt方法只適用於Unicode編碼字元,對於ASCII字元沒有任何影響。如果在一個ASCII字元串中應用了codePointAt方法,它將返回與charCodeAt的結果相同。

另外,如果我們傳遞一個負的index,codePointAt方法將返回undefined。如果傳遞的index大於或等於字元串的長度,也會返回undefined。

let str = 'Hello World!';

console.log(str.charCodeAt(-1)); // undefined
console.log(str.charCodeAt(99)); // undefined

四、codePointAt()方法的兼容性

codePointAt方法在ES6中引入,因此在舊版本的JavaScript引擎中不可用。我們可以使用polyfill或特性檢測來解決這個問題,例如:

if (!String.prototype.codePointAt) {
  String.prototype.codePointAt = function(pos) {
    pos = isNaN(pos) ? 0 : pos;
    var str = this.toString(),
        code = str.charCodeAt(pos),
        next = str.charCodeAt(pos + 1),
        hi,
        low;

    if (code >= 0xd800 && code = 0xdc00 && next <= 0xdfff) {
      hi = code - 0xd800;
      low = next - 0xdc00;
      return (hi << 10) + low + 0x10000;
    } else {
      return code;
    }
  };
}

這個polyfill通過檢查每個字元的Unicode碼點來模擬codePointAt方法的行為,並正確解析高代理項和低代理項。

五、總結

String.prototype.charCodeAt方法與String.prototype.codePointAt方法用於訪問字元串中字元的Unicode碼點。然而,在ES6之前,charCodeAt方法不能完全表示UTF-16編碼的所有字元的Unicode碼點,而codePointAt方法可以返回完整的Unicode碼點序列。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/187128.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-27 13:35
下一篇 2024-11-27 13:35

相關推薦

  • 解決.net 6.0運行閃退的方法

    如果你正在使用.net 6.0開發應用程序,可能會遇到程序閃退的情況。這篇文章將從多個方面為你解決這個問題。 一、代碼問題 代碼問題是導致.net 6.0程序閃退的主要原因之一。首…

    編程 2025-04-29
  • ArcGIS更改標註位置為中心的方法

    本篇文章將從多個方面詳細闡述如何在ArcGIS中更改標註位置為中心。讓我們一步步來看。 一、禁止標註智能調整 在ArcMap中設置標註智能調整可以自動將標註位置調整到最佳顯示位置。…

    編程 2025-04-29
  • Python中init方法的作用及使用方法

    Python中的init方法是一個類的構造函數,在創建對象時被調用。在本篇文章中,我們將從多個方面詳細討論init方法的作用,使用方法以及注意點。 一、定義init方法 在Pyth…

    編程 2025-04-29
  • Python創建分配內存的方法

    在python中,我們常常需要創建並分配內存來存儲數據。不同的類型和數據結構可能需要不同的方法來分配內存。本文將從多個方面介紹Python創建分配內存的方法,包括列表、元組、字典、…

    編程 2025-04-29
  • 用不同的方法求素數

    素數是指只能被1和自身整除的正整數,如2、3、5、7、11、13等。素數在密碼學、計算機科學、數學、物理等領域都有著廣泛的應用。本文將介紹幾種常見的求素數的方法,包括暴力枚舉法、埃…

    編程 2025-04-29
  • Python中讀入csv文件數據的方法用法介紹

    csv是一種常見的數據格式,通常用於存儲小型數據集。Python作為一種廣泛流行的編程語言,內置了許多操作csv文件的庫。本文將從多個方面詳細介紹Python讀入csv文件的方法。…

    編程 2025-04-29
  • 使用Vue實現前端AES加密並輸出為十六進位的方法

    在前端開發中,數據傳輸的安全性問題十分重要,其中一種保護數據安全的方式是加密。本文將會介紹如何使用Vue框架實現前端AES加密並將加密結果輸出為十六進位。 一、AES加密介紹 AE…

    編程 2025-04-29
  • Python學習筆記:去除字元串最後一個字元的方法

    本文將從多個方面詳細闡述如何通過Python去除字元串最後一個字元,包括使用切片、pop()、刪除、替換等方法來實現。 一、字元串切片 在Python中,可以通過字元串切片的方式來…

    編程 2025-04-29
  • 用法介紹Python集合update方法

    Python集合(set)update()方法是Python的一種集合操作方法,用於將多個集合合併為一個集合。本篇文章將從以下幾個方面進行詳細闡述: 一、參數的含義和用法 Pyth…

    編程 2025-04-29
  • Vb運行程序的三種方法

    VB是一種非常實用的編程工具,它可以被用於開發各種不同的應用程序,從簡單的計算器到更複雜的商業軟體。在VB中,有許多不同的方法可以運行程序,包括編譯器、發布程序以及命令行。在本文中…

    編程 2025-04-29

發表回復

登錄後才能評論