在JS中获取字符串的位数的几种方法小结

 更新时间:2026年06月01日 09:37:50   作者:雷工笔记  
在 JavaScript 中获取字符串的位数(字符数)有多种方法,核心区别在于是否能正确处理 Unicode 特殊字符(如 emoji、生僻字),以下是详细解析和最佳实践,需要的朋友可以参考下

引言

今天在使用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计算并提示用户

以上就是在JS中获取字符串的位数的几种方法小结的详细内容,更多关于JavaScript获取字符串位数的资料请关注脚本之家其它相关文章!

相关文章

  • PJBlog插件 防刷新的在线播放器

    PJBlog插件 防刷新的在线播放器

    该播放器类似框架式的~设置在页面底部 即使查看网页的另一个页面,歌曲也不会因为刷新而停止并重新播放
    2006-10-10
  • 微信小程序工具函数封装

    微信小程序工具函数封装

    这篇文章主要为大家详细介绍了微信小程序工具函数封装,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • javascript对象的多种合并方式详解

    javascript对象的多种合并方式详解

    这篇文章主要介绍了JavaScript中的多种对象合并方法,通过代码的形式给大家介绍的非常详细,需要的朋友可以参考下,希望能够给你带来帮助
    2021-08-08
  • js注入 黑客之路必备!

    js注入 黑客之路必备!

    这篇文章主要为大家详细介绍了js注入,黑客之路必备!本文告诉大家什么是js注入,如何进行js注入攻防,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • myEvent.js javascript跨浏览器事件框架

    myEvent.js javascript跨浏览器事件框架

    IE与现代浏览器在DOM中最大的差异是什么无疑就是event了。各个浏览器接口的差异以及够头疼了,而IE甚至Firefox早期版本由于内存管理机制不完善,很容易在事件处理中导致内存泄漏
    2011-10-10
  • JS正则表达式修饰符global(/g)用法分析

    JS正则表达式修饰符global(/g)用法分析

    这篇文章主要介绍了JS正则表达式修饰符global(/g)用法,结合实例形式分析了JS全局匹配修饰符/g的功能、使用方法与相关注意事项,需要的朋友可以参考下
    2016-12-12
  • layui中的switch开关实现方法

    layui中的switch开关实现方法

    今天小编就为大家分享一篇layui中的switch开关实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • js打开word文档预览操作示例【不是下载】

    js打开word文档预览操作示例【不是下载】

    这篇文章主要介绍了js打开word文档预览操作,结合实例形式分析了两种javascript打开word文档在线预览相关操作技巧,需要的朋友可以参考下
    2019-05-05
  • 基于JavaScript实现轮播图效果

    基于JavaScript实现轮播图效果

    这篇文章主要为大家详细介绍了基于JavaScript实现轮播图效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • Javascript开发包大全整理

    Javascript开发包大全整理

    Javascript开发包大全整理...
    2006-12-12

最新评论