news 2026/5/27 22:55:37

JavaScript系列25:在 JS 中获取字符串的 “位数”的几种方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JavaScript系列25:在 JS 中获取字符串的 “位数”的几种方法

今天在使用KingFusion开发MES系统的过程中,遇到需要获取字符串有几位的判断;
在 JavaScript 中获取字符串的 “位数”(字符数)有多种方法,核心区别在于是否能正确处理 Unicode 特殊字符(如 emoji、生僻字)。
以下是详细解析和最佳实践:

一、最常用:length属性(基础场景)

语法

字符串.length

说明

  • 这是 JavaScript 原生提供的只读属性,不是方法,无需加括号
  • 计数规则:按UTF-16 代码单元统计,每个 BMP 平面(基本多语言平面)字符占 1 个代码单元
  • 适用场景:仅包含 ASCII 字符、中文、日文、韩文等常见字符的字符串

示例

console.log("abc".length); // 3(英文字母) console.log("你好世界".length); // 4(中文) console.log("123456".length); // 6(数字) console.log("a1b2c3".length); // 6(混合)

二、⚠️ 致命坑点:length对特殊字符计数错误

length无法正确识别占 2 个 UTF-16 代码单元的字符,会导致计数翻倍:

  • Emoji 表情(如😀、❤️、👍)
  • 生僻汉字(如𠮷、𠮶、𠹌)
  • 特殊符号(如𝄞、𝅘𝅥𝅮)

错误示例

console.log("😀".length); // 2(实际1个字符) console.log("👍❤️".length); // 4(实际2个字符) console.log("𠮷".length); // 2(实际1个生僻字) console.log("a😀b".length); // 4(实际3个字符)

三、正确获取所有字符数(含特殊字符)

方法 1:ES6 扩展运算符[...str].length(推荐)

利用 ES6 的迭代器特性,能正确拆分 Unicode 字符,性能优秀且写法简洁。

console.log([..."😀"].length); // 1(正确) console.log([..."👍❤️"].length); // 2(正确) console.log([..."a😀b"].length); // 3(正确) console.log([..."𠮷𠮶𠹌"].length); // 3(正确)

方法 2:Array.from(str).length(兼容性更好)

功能与扩展运算符完全一致,对旧环境的兼容性略好(需 ES6 支持)。

console.log(Array.from("😀😃😄").length); // 3 console.log(Array.from("你好😀世界").length); // 5

方法 3:正则表达式/./u匹配(备用)

使用带u标志的正则表达式匹配所有 Unicode 字符,再统计数量。

function getCharCount(str) { return (str.match(/./gu) || []).length; } console.log(getCharCount("😀👍❤️")); // 3 console.log(getCharCount("")); // 0(空字符串处理)

四、拓展:获取字符串的字节数

如果需要获取字符串的字节长度(而非字符数),不同编码下结果不同:

1. UTF-8 字节数(最常用)

function getUtf8ByteLength(str) { return new TextEncoder().encode(str).length; } console.log(getUtf8ByteLength("abc")); // 3(1字节/字符) console.log(getUtf8ByteLength("你好")); // 6(3字节/中文字符) console.log(getUtf8ByteLength("😀")); // 4(4字节/emoji)

2. UTF-16 字节数(与length对应)

function getUtf16ByteLength(str) { return str.length * 2; } console.log(getUtf16ByteLength("abc")); // 6 console.log(getUtf16ByteLength("😀")); // 4

五、方法对比与最佳实践

方法正确处理特殊字符性能兼容性适用场景
str.length极高所有浏览器仅含常见字符的简单场景
[...str].lengthES6+(现代浏览器)绝大多数业务场景(推荐)
Array.from(str).lengthES6+与扩展运算符一致
正则/./uES6+特殊正则匹配场景
TextEncoder-现代浏览器需要 UTF-8 字节数时

通用最佳实践

// 封装一个通用的字符数获取函数 function getStringLength(str) { // 空字符串处理 if (!str) return 0; // 优先使用扩展运算符 return [...str].length; } // 使用示例 console.log(getStringLength("你好😀世界123")); // 7

六、常见业务场景注意事项

  1. 输入框字数限制:如果允许用户输入 emoji,绝对不能用length,否则会出现 “输入 1 个 emoji 算 2 个字符” 的 bug
  2. 字符串截断:截断包含 emoji 的字符串时,需用Array.from拆分后再截取,避免截断到代理对中间导致乱码
  3. 后端交互:后端通常按 UTF-8 字节数限制长度,前端需提前用TextEncoder计算并提示用户
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/27 22:54:43

从IDA数据提取到路径MD5:一条龙搞定CTF迷宫逆向题的完整避坑指南

从IDA数据提取到路径MD5:CTF迷宫逆向全链路避坑实战迷宫类逆向题在CTF竞赛中属于"看似简单却暗藏杀机"的经典题型。许多参赛者能够快速识别题目类型,却在数据提取、路径求解等环节频繁翻车。本文将构建一套从静态分析到flag生成的完整工作流&a…

作者头像 李华
网站建设 2026/5/27 22:54:41

2026年AI巅峰对决:Claude Opus 4.6与GPT-5.3-Codex深度横评与选型指南

1. 项目概述:一场迟来的“巅峰对决”评测2026年4月,对于关注前沿AI模型动态的从业者和技术爱好者而言,是一个值得标记的月份。两大顶级AI研究机构几乎在同一时间窗口,更新了他们的旗舰模型:Anthropic发布了Claude Opus…

作者头像 李华
网站建设 2026/5/27 22:54:32

TMS320F280049 I2C 驱动实战:从库函数到CAT24C02存储器的非中断读写优化

1. TMS320F280049 I2C驱动基础解析 第一次接触TMS320F280049的I2C外设时,我被官方文档里那些晦涩的寄存器描述绕得头晕。后来在实际项目中用CAT24C02存储器时才发现,其实掌握几个关键点就能快速上手。I2C作为嵌入式系统中最常用的通信协议之一&#xff0…

作者头像 李华
网站建设 2026/5/27 22:53:32

一小时构建简历MCP服务器:基于Node.js与MCP协议的AI应用开发实战

1. 项目概述:一小时构建简历MCP的挑战与价值最近在开发者社区里,一个关于“一小时构建简历MCP”的话题引起了我的兴趣。MCP,即“模型上下文协议”,是当前AI应用开发中的一个热门概念,它本质上是一种标准化的接口&#…

作者头像 李华