当
Blob
或 File
的长度大于 Number.MAX_SAFE_INTEGER
字节(8 PiB;9 PB)时,JavaScript 如何处理?
let file = await filePrompt("Please upload a ten petabyte file.");
let len = file.byteLength;
for ( let i = ((len <= Number.MAX_SAFE_INTEGER) ? 0 : BigInt(0)) ; i < len ; i++ ) {
…
}
以上面的代码为例,会
typeof len === 'bigint'
吗?
(我无法访问具有足够资源的运行时环境来测试这一点。)
File
size
的内部表示是 unsigned long long
。为了将其公开给 JavaScript,WebIDL 规范说:
将 IDL
值转换为 ECMAScript value 是一个 Number 值,表示最接近的数字 值到unsigned long long
,选择带有 偶数有效数如果有两个同样接近 价值观。如果unsigned long long
小于或等于 253 − 1,那么这个数字就能准确表示 与unsigned long long
相同的值。unsigned long long
所以是的,它可能会失去精度。在这些情况下,它不会生成 BigInt。
但是,我有理由确定大多数浏览器首先无法打开这样的文件,而是会抛出异常。