最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在JS中獲取字符串的位數(shù)的幾種方法小結(jié)

 更新時(shí)間:2026年06月01日 09:37:50   作者:雷工筆記  
在 JavaScript 中獲取字符串的位數(shù)(字符數(shù))有多種方法,核心區(qū)別在于是否能正確處理 Unicode 特殊字符(如 emoji、生僻字),以下是詳細(xì)解析和最佳實(shí)踐,需要的朋友可以參考下

引言

今天在使用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)

  1. 輸入框字?jǐn)?shù)限制:如果允許用戶輸入 emoji,絕對(duì)不能用length,否則會(huì)出現(xiàn) “輸入 1 個(gè) emoji 算 2 個(gè)字符” 的 bug
  2. 字符串截?cái)?/strong>:截?cái)喟?emoji 的字符串時(shí),需用Array.from拆分后再截取,避免截?cái)嗟酱韺?duì)中間導(dǎo)致亂碼
  3. 后端交互:后端通常按 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)文章

  • 犀利的js 函數(shù)集合

    犀利的js 函數(shù)集合

    和同事討論js時(shí),我說(shuō)較為理想的狀態(tài)是,把js當(dāng)一把好用的匕首,隨手拿來(lái),捅一刀子就走。話雖如此,但現(xiàn)實(shí)生活中大部分時(shí)候的情況是不理想的。
    2009-06-06
  • Three.js利用Detector.js插件如何實(shí)現(xiàn)兼容性檢測(cè)詳解

    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)證碼按鈕效果

    微信小程序?qū)崿F(xiàn)發(fā)送驗(yàn)證碼按鈕效果

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)發(fā)送驗(yàn)證碼按鈕效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • 微信小程序視圖容器(swiper)組件創(chuàng)建輪播圖

    微信小程序視圖容器(swiper)組件創(chuàng)建輪播圖

    這篇文章主要為大家詳細(xì)介紹了微信小程序視圖容器(swiper)組件創(chuàng)建輪播圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • JavaScript實(shí)現(xiàn)瀏覽器內(nèi)多個(gè)標(biāo)簽頁(yè)通信方式詳解

    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)換的分類及步驟詳解

    這篇文章主要為大家介紹了JavaScript對(duì)象類型轉(zhuǎn)換的分類及步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • uniapp時(shí)間格式和距離格式的轉(zhuǎn)換

    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è)置圖片大小的方法

    這篇文章主要介紹了微信小程序動(dòng)態(tài)設(shè)置圖片大小的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • qrcode生成二維碼微信長(zhǎng)按無(wú)法識(shí)別問(wèn)題的解決

    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)效果

    這篇文章主要介紹了js實(shí)現(xiàn)div在頁(yè)面拖動(dòng)效果,涉及JavaScript動(dòng)態(tài)操作頁(yè)面元素與數(shù)值計(jì)算的相關(guān)技巧,需要的朋友可以參考下
    2016-05-05

最新評(píng)論

定西市| 错那县| 科技| 阆中市| 永登县| 铁岭县| 荔浦县| 林西县| 通榆县| 温宿县| 平邑县| 乌苏市| 贡嘎县| 明星| 泰安市| 成安县| 罗城| 湟中县| 凤冈县| 靖西县| 阿拉善右旗| 余姚市| 工布江达县| 麟游县| 分宜县| 丰城市| 文昌市| 始兴县| 灵石县| 思南县| 南投县| 富宁县| 兴文县| 青川县| 沅江市| 怀化市| 色达县| 西峡县| 车致| 延吉市| 喀喇|