JS中字符串長度計算有多種方法,需根據場景選擇。①Length屬性最簡單但可能錯誤處理unicode字符;②split()方法分割字符串為數組后統計長度;③Array.from()能正確處理如emoji等unicode字符;④正則表達式可用于匹配特定字符后統計;⑤循環遍歷可自定義規則計算長度;⑥intl.segmenter api實驗性支持更精確的文本分割。js字符串內部以utf-16編碼存儲,length返回代碼單元數量,對增補字符如emoji會出錯,需用array.from()或intl.segmenter正確處理。對于中英文混合字符串的真實長度計算,可通過判斷字符unicode范圍,英文字符算1,中文算2,通過遍歷實現更準確計數。
字符串長度計算在JS中,其實沒那么死板。方法很多,關鍵看你用哪個順手,哪個更適合你的場景。別想著一步到位,靈活點,組合著用效果更好。
解決方案
-
length 屬性: 這是最簡單直接的方法,直接訪問字符串的length屬性就能得到字符串的長度。但要注意,它把所有字符都算作一個長度,包括一些特殊字符。
let str = "Hello, world!"; console.log(str.length); // 輸出 13
-
split() 方法: 可以用空字符串 “” 作為分隔符,將字符串分割成字符數組,然后取數組的長度。
let str = "你好世界"; console.log(str.split("").length); // 輸出 4
-
Array.from() 方法: es6 引入的,可以將字符串轉換為數組,正確處理 Unicode 字符(比如 emoji)。
let str = "你好?"; console.log(Array.from(str).length); // 輸出 3,正確處理了emoji
-
使用正則表達式: 可以用正則表達式匹配字符串中的字符,然后計算匹配到的數量。這在處理包含特定字符的字符串時很有用。
let str = "Hello123World456"; let matches = str.match(/[u4e00-u9fa5]/g); // 匹配中文 console.log(matches ? matches.length : 0); // 輸出 0,因為沒有中文
-
循環遍歷: 最原始的方法,遍歷字符串中的每個字符,計數器加一。可以自定義字符長度的計算規則。
function getStringLength(str) { let count = 0; for (let i = 0; i < str.length; i++) { // 可以根據需要添加判斷邏輯,比如中文算兩個字符長度 count++; } return count; } let str = "Hello 你好"; console.log(getStringLength(str)); // 輸出 9
-
Intl.Segmenter API (實驗性): 這是一個比較新的API,用于文本分割,可以更精確地處理不同語言的字符。目前還在實驗階段,兼容性可能不太好。
const segmenter = new Intl.Segmenter('zh-CN', { granularity: 'grapheme' }); const string = '你好?世界'; const segments = [...segmenter.segment(string)]; console.log(segments.length); // 輸出 5,正確處理了emoji
JS中length屬性的底層原理是什么?
length 屬性之所以能直接返回字符串長度,是因為JS字符串在內部是以 UTF-16 編碼存儲的。length 屬性直接返回字符串中 UTF-16 代碼單元的數量。對于 BMP (基本多文種平面) 中的字符,一個字符對應一個代碼單元,所以 length 沒問題。但對于增補字符 (Supplementary Characters),一個字符需要兩個代碼單元來表示,這時候 length 就會出錯。這就是為什么需要 Array.from() 或 Intl.Segmenter 來正確處理 Unicode 字符的原因。
如何計算包含中英文混合字符串的真實長度?
中文通常占用兩個字節,英文占用一個字節。如果需要計算這種“真實長度”,可以遍歷字符串,判斷每個字符的 Unicode 編碼范圍,然后累加長度。
function getRealLength(str) { let realLength = 0; for (let i = 0; i < str.length; i++) { let charCode = str.charCodeAt(i); if (charCode >= 0 && charCode <= 128) { realLength += 1; // 英文字符 } else { realLength += 2; // 中文字符或其他雙字節字符 } } return realLength; } let str = "Hello 你好"; console.log(getRealLength(str)); // 輸出 10
為什么處理emoji表情時,普通的length屬性會失效?
Emoji 表情通常屬于 Unicode 增補字符,它們需要兩個 UTF-16 代碼單元來表示。因此,length 屬性會將一個 emoji 算作兩個字符長度。Array.from() 和 Intl.Segmenter 能夠正確識別這些增補字符,將它們作為一個整體來處理。
let str = "Hello?"; console.log(str.length); // 輸出 7,錯誤 console.log(Array.from(str).length); // 輸出 6,正確