JavaScript中超8PiB的Blob/File的byteLength是BigInt类型吗?
问题结论
typeof len === 'bigint' 这个判断完全不成立。
超大尺寸Blob/File的处理逻辑
- 按照现行Web API标准定义,
Blob(包括继承自它的File对象)的长度属性(标准属性名为size,你示例里写的byteLength是ArrayBuffer、TypedArray这类二进制缓冲结构的长度属性,属于笔误)永远返回Number类型的值,不会因为实际字节数超过Number.MAX_SAFE_INTEGER就自动切换为BigInt类型。 - 当Blob/File的实际字节长度超过
Number.MAX_SAFE_INTEGER(即2^53-1,约8PiB)时,返回的长度值会出现精度丢失,是经过IEEE 754双精度浮点数舍入后的不精确值,无法准确对应真实的文件大小。 - 你示例里写的分支判断逻辑完全无效:因为拿到的长度值永远是Number类型,当文件大小超过安全整数范围时,
len <= Number.MAX_SAFE_INTEGER的判断结果本身就可能因为精度丢失出错,后续就算初始化了BigInt类型的循环变量,和这个不精确的Number长度值做比较,也没法得到正确的循环终止条件,根本实现不了逐字节遍历的逻辑。
目前所有主流浏览器、Node.js等JS运行时,都没有实现BigInt版本的Blob/File长度返回值,哪怕真的加载了10PiB的文件,拿到的长度值依然是精度丢失的Number,不会是BigInt类型。
内容的提问来源于stack exchange,提问作者JamesTheAwesomeDude
相关产品推荐
相关产品推荐

