在JS中獲取字符串的位數(shù)的幾種方法小結(jié)
引言
今天在使用KingFusion開發(fā)MES系統(tǒng)的過(guò)程中,遇到需要獲取字符串有幾位的判斷;
在 JavaScript 中獲取字符串的 “位數(shù)”(字符數(shù))有多種方法,核心區(qū)別在于是否能正確處理 Unicode 特殊字符(如 emoji、生僻字)。
以下是詳細(xì)解析和最佳實(shí)踐:
一、最常用:length屬性(基礎(chǔ)場(chǎng)景)
語(yǔ)法
字符串.length
說(shuō)明
- 這是 JavaScript 原生提供的只讀屬性,不是方法,無(wú)需加括號(hào)
- 計(jì)數(shù)規(guī)則:按UTF-16 代碼單元統(tǒng)計(jì),每個(gè) BMP 平面(基本多語(yǔ)言平面)字符占 1 個(gè)代碼單元
- 適用場(chǎng)景:僅包含 ASCII 字符、中文、日文、韓文等常見字符的字符串
示例
console.log("abc".length); // 3(英文字母)
console.log("你好世界".length); // 4(中文)
console.log("123456".length); // 6(數(shù)字)
console.log("a1b2c3".length); // 6(混合)二、致命坑點(diǎn):length對(duì)特殊字符計(jì)數(shù)錯(cuò)誤
length 無(wú)法正確識(shí)別占 2 個(gè) UTF-16 代碼單元的字符,會(huì)導(dǎo)致計(jì)數(shù)翻倍:
- Emoji 表情(如??、??、??)
- 生僻漢字(如??、??、??)
- 特殊符號(hào)(如??、??????)
錯(cuò)誤示例
console.log("??".length); // 2(實(shí)際1個(gè)字符)
console.log("????".length); // 4(實(shí)際2個(gè)字符)
console.log("??".length); // 2(實(shí)際1個(gè)生僻字)
console.log("a??b".length); // 4(實(shí)際3個(gè)字符)三、正確獲取所有字符數(shù)(含特殊字符)
方法 1:ES6 擴(kuò)展運(yùn)算符[...str].length(推薦)
利用 ES6 的迭代器特性,能正確拆分 Unicode 字符,性能優(yōu)秀且寫法簡(jiǎn)潔。
console.log([..."??"].length); // 1(正確) console.log([..."????"].length); // 2(正確) console.log([..."a??b"].length); // 3(正確) console.log([..."??????"].length); // 3(正確)
方法 2:Array.from(str).length(兼容性更好)
功能與擴(kuò)展運(yùn)算符完全一致,對(duì)舊環(huán)境的兼容性略好(需 ES6 支持)。
console.log(Array.from("??????").length); // 3 console.log(Array.from("你好??世界").length); // 5 方法 3:正則表達(dá)式/./u匹配(備用)
使用帶u標(biāo)志的正則表達(dá)式匹配所有 Unicode 字符,再統(tǒng)計(jì)數(shù)量。
function getCharCount(str) {
return (str.match(/./gu) || []).length;
}
console.log(getCharCount("??????")); // 3
console.log(getCharCount("")); // 0(空字符串處理)四、拓展:獲取字符串的字節(jié)數(shù)
如果需要獲取字符串的字節(jié)長(zhǎng)度(而非字符數(shù)),不同編碼下結(jié)果不同:
1. UTF-8 字節(jié)數(shù)(最常用)
function getUtf8ByteLength(str) {
return new TextEncoder().encode(str).length;
}
console.log(getUtf8ByteLength("abc")); // 3(1字節(jié)/字符)
console.log(getUtf8ByteLength("你好")); // 6(3字節(jié)/中文字符)
console.log(getUtf8ByteLength("??")); // 4(4字節(jié)/emoji)2. UTF-16 字節(jié)數(shù)(與length對(duì)應(yīng))
function getUtf16ByteLength(str) {
return str.length * 2;
}
console.log(getUtf16ByteLength("abc")); // 6
console.log(getUtf16ByteLength("??")); // 4五、方法對(duì)比與最佳實(shí)踐
| 方法 | 正確處理特殊字符 | 性能 | 兼容性 | 適用場(chǎng)景 |
|---|---|---|---|---|
str.length | ? | 極高 | 所有瀏覽器 | 僅含常見字符的簡(jiǎn)單場(chǎng)景 |
[...str].length | ? | 高 | ES6+(現(xiàn)代瀏覽器) | 絕大多數(shù)業(yè)務(wù)場(chǎng)景(推薦) |
Array.from(str).length | ? | 高 | ES6+ | 與擴(kuò)展運(yùn)算符一致 |
正則/./u | ? | 中 | ES6+ | 特殊正則匹配場(chǎng)景 |
TextEncoder | - | 中 | 現(xiàn)代瀏覽器 | 需要 UTF-8 字節(jié)數(shù)時(shí) |
通用最佳實(shí)踐
// 封裝一個(gè)通用的字符數(shù)獲取函數(shù)
function getStringLength(str) {
// 空字符串處理
if (!str) return 0;
// 優(yōu)先使用擴(kuò)展運(yùn)算符
return [...str].length;
}
// 使用示例
console.log(getStringLength("你好??世界123")); // 7六、常見業(yè)務(wù)場(chǎng)景注意事項(xiàng)
- 輸入框字?jǐn)?shù)限制:如果允許用戶輸入 emoji,絕對(duì)不能用
length,否則會(huì)出現(xiàn) “輸入 1 個(gè) emoji 算 2 個(gè)字符” 的 bug - 字符串截?cái)?/strong>:截?cái)喟?emoji 的字符串時(shí),需用
Array.from拆分后再截取,避免截?cái)嗟酱韺?duì)中間導(dǎo)致亂碼 - 后端交互:后端通常按 UTF-8 字節(jié)數(shù)限制長(zhǎng)度,前端需提前用
TextEncoder計(jì)算并提示用戶
以上就是在JS中獲取字符串的位數(shù)的幾種方法小結(jié)的詳細(xì)內(nèi)容,更多關(guān)于JavaScript獲取字符串位數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Three.js利用Detector.js插件如何實(shí)現(xiàn)兼容性檢測(cè)詳解
這篇文章主要給大家介紹了關(guān)于Three.js利用Detector.js插件如何實(shí)現(xiàn)兼容性檢測(cè)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-09-09
微信小程序?qū)崿F(xiàn)發(fā)送驗(yàn)證碼按鈕效果
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)發(fā)送驗(yàn)證碼按鈕效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
微信小程序視圖容器(swiper)組件創(chuàng)建輪播圖
這篇文章主要為大家詳細(xì)介紹了微信小程序視圖容器(swiper)組件創(chuàng)建輪播圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
JavaScript實(shí)現(xiàn)瀏覽器內(nèi)多個(gè)標(biāo)簽頁(yè)通信方式詳解
在瀏覽器中,多個(gè)標(biāo)簽頁(yè)(頁(yè)簽)之間的通信有一些方法可以實(shí)現(xiàn),這篇文章為大家整理了6個(gè)常用的方法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-03-03
JavaScript對(duì)象類型轉(zhuǎn)換的分類及步驟詳解
這篇文章主要為大家介紹了JavaScript對(duì)象類型轉(zhuǎn)換的分類及步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
uniapp時(shí)間格式和距離格式的轉(zhuǎn)換
這篇文章主要介紹了uniapp時(shí)間格式和距離格式的轉(zhuǎn)換,第一種是把? YYYY-MM-DD hh:mm:ss 轉(zhuǎn)換成?MM月DD日,第二種是把? hh:mm:ss 轉(zhuǎn)換成?hh:mm,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09
微信小程序動(dòng)態(tài)設(shè)置圖片大小的方法
這篇文章主要介紹了微信小程序動(dòng)態(tài)設(shè)置圖片大小的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11
qrcode生成二維碼微信長(zhǎng)按無(wú)法識(shí)別問(wèn)題的解決
這篇文章主要介紹了qrcode生成二維碼微信長(zhǎng)按無(wú)法識(shí)別問(wèn)題的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
js實(shí)現(xiàn)div在頁(yè)面拖動(dòng)效果
這篇文章主要介紹了js實(shí)現(xiàn)div在頁(yè)面拖動(dòng)效果,涉及JavaScript動(dòng)態(tài)操作頁(yè)面元素與數(shù)值計(jì)算的相關(guān)技巧,需要的朋友可以參考下2016-05-05

