在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