不能直接用 .length,因为 javascript 字符串的 .length 返回 utf-16 码元个数,而非 utf-8 字节数;例如 "€" 的 .length 为 1,但 utf-8 占 3 字节,"?" 的 .length 为 2,utf-8 占 4 字节。

直接用 JSON.stringify 转成字符串后取 .length 得到的是字符数,不是字节大小。因为 JavaScript 字符串是 UTF-16 编码,一个中文字符或 emoji 占 2 个(甚至 4 个)UTF-16 码元,但实际 UTF-8 编码下可能占 3 或 4 字节。所以要估算**近似字节大小**,得按 UTF-8 编码规则转换。
为什么不能直接用 .length?
JavaScript 中字符串的 .length 返回的是 UTF-16 码元个数,不是字节数。例如:
-
"a".length === 1→ UTF-8 占 1 字节 ✔️ -
"€".length === 1→ 实际 UTF-8 占 3 字节 ❌(.length还是 1) -
"?".length === 2(代理对)→ UTF-8 占 4 字节,但.length是 2
用 TextEncoder 估算 UTF-8 字节数(推荐)
现代浏览器和 Node.js(≥11.0)支持 TextEncoder,它能把字符串编码为 UTF-8 字节数组,长度就是真实字节数:
function approxByteSize(obj) {
const str = JSON.stringify(obj);
return new TextEncoder().encode(str).length;
}
这是目前最准确、最轻量的近似方式。注意:它包含 JSON 序列化后的所有引号、逗号、空格等,符合实际网络传输或存储占用。
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
不支持 TextEncoder 时的降级方案(仅 ASCII 安全)
如果必须兼容极老环境(如 IE),且确定数据只含 ASCII 字符(纯数字、英文、基本符号),可保守用 .length —— 此时每个字符 ≈ 1 字节。但一旦出现中文、emoji、特殊符号,结果会严重偏低。
更稳妥的降级做法是手动遍历字符串估算 UTF-8 字节数(模拟编码逻辑),但通常没必要——除非你明确不能用 TextEncoder。
别忽略序列化选项的影响
JSON.stringify 的格式会影响字节数。例如:
-
JSON.stringify({a:1})→"{"a":1}"(10 字节) -
JSON.stringify({a:1}, null, 2)→ 带缩进,字节数翻倍
计算大小前,确保用和实际使用一致的参数调用 JSON.stringify,否则结果无参考价值。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










