Javascript计算字符串长度

在开发中,可能会遇到动态计算字符串的长度的需求,根据容器宽度和字符串的长度,判断是否需要在字符串后拼接省略号展示。
HTML页面中的字符,中文/英文和字符,所占的宽度不同,一个中文字符的间距 约等同于 两个英文或字符 的宽度,所以在计算字符串展示在页面中的真实宽度时候,需要区分中文/英文和字符。
代码如下图:

/**
 * 计算显示的字符串
 * @param {string} str 要裁剪的字符串
 * @param {number} maxWidth 最大宽度
 * @param {number} fontSize 字体大小
 * @return {string} 显示的字符串
 */
export const fittingString = (str, maxWidth, fontSize = 12) &
### JavaScript计算字符串长度的方法 在 JavaScript 中,可以通过 `String.prototype.length` 属性获取字符串的字符数。然而,如果需要像 Java 的 `String.getBytes().length` 那样按字节长度计算,则需额外处理多字节字符的情况。 #### 使用内置属性 `.length` 对于简单的 Unicode 字符串,可以直接通过 `.length` 访问其字符数量[^1]: ```javascript const str = "hello"; console.log(str.length); // 输出 5 ``` 此方法仅统计 UTF-16 编码中的代码单元数目,无法区分单字节或多字节字符。 #### 处理多字节字符的解决方案 为了实现类似于 Java 的字节长度计算功能,可以借助编码库或将字符串手动转为二进制形式。以下是两种常见方式: ##### 方法一:利用 TextEncoder API 现代浏览器支持 `TextEncoder` 接口,可将字符串转换为 Uint8Array 并测量其实际大小: ```javascript function getByteLength(text) { const encoder = new TextEncoder(); const uint8Array = encoder.encode(text); return uint8Array.length; } console.log(getByteLength("你好")); // 输出 6 (两个汉字各占三字节) ``` 这种方法依赖于浏览器环境的支持情况。 ##### 方法二:自定义函数逐位分析 如果不希望引入外部工具或兼容较旧平台,可通过正则表达式匹配并累加每部分占用的空间量: ```javascript function getStringByteLength(s) { let totalBytes = 0; for (let i = 0; i < s.length; i++) { const codePoint = s.charCodeAt(i); if (codePoint <= 0x7F) { // ASCII range totalBytes += 1; } else if (codePoint <= 0x7FF) { // Two-byte characters totalBytes += 2; } else if ((codePoint & 0xFC00) === 0xD800 && (s[i + 1].charCodeAt(0) & 0xFC00) === 0xDC00) { ++i; // Surrogate pair handling totalBytes += 4; // Four bytes combined } else { // Three-byte characters totalBytes += 3; } } return totalBytes; } console.log(getStringByteLength("abc")); // 输出 3 console.log(getStringByteLength("你好世界")); // 输出 12 ``` 上述逻辑涵盖了大部分场景下的需求,并能较好地应对复杂输入数据集。 --- ### 数据类型与隐式转换的影响 值得注意的是,在涉及数值运算时可能会触发自动类型转换行为,这可能间接影响最终结果准确性。例如当拼接字符串和数字时会优先执行字符串化操作而非纯粹数学求值过程[^2]: ```javascript let concatenatedResult = 123 + ""; // 结果:"123" ``` 因此建议开发者明确指定所需动作以减少意外状况发生几率。 最后提醒一点关于特殊对象实例检测手段方面的问题——尽管表面上看来 `null` 应该归属于某种特定类别标签之下但实际上却被标记成了通用容器标识即 `"object"` 类型[^3]. ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值