类型的Javascript最大大小?

IT技术 javascript cross-browser ecma262
2021-03-16 08:07:14

查看 javascript 类型我试图找出某些数据类型的最大存储大小是多少。例如,我设置了一个快速递归算法来增加 var 大小,直到浏览器崩溃,对于我现有版本的 chrome 上的字符串,最终结果接近 128mb(或者可能是 256)。

我一直在以痛苦的方式做这件事,因为我找不到任何关于此的规范,但不断的浏览器崩溃使这成为一个痛苦的尝试(由于某些原因,对于这个特定问题,try catch 似乎毫无用处)。

我也在寻找有关其他类型的最大存储大小的信息(数组、对象、函数、字符串、数字、布尔值......)

EMCA-262 第 8.4 节对此含糊其辞

字符串的长度是其中的元素数(即 16 位值)。空字符串的长度为零,因此不包含任何元素。

...所以也许这是需要在浏览器中实现的东西?

然而,ECMA 确实会告诉我们有关数字的信息,例如,

Number 类型正好有 18437736874454810627(即 2^64−2^53+3)个值,表示 IEEE 二进制浮点运算标准中指定的双精度 64 位格式 IEEE 754 值,除了IEEE 标准的 9007199254740990(即 2^53−2)个不同的“非数字”值在 ECMAScript 中表示为单个特殊 NaN 值。

但是后来我看不到任何关于对象的信息。

我可以期待在浏览器中使用什么?是否有任何代码库可以帮助管理非常大的对象和字符串?

我可以在单个脚本中分配多少内存?

3个回答

正如你已经说过的,规范并没有说明除了用于任何类型的大小限制/要求Number

所以这绝对是留给实现的。

例如,Chrome 对字符串的限制似乎是硬编码在 512mb 左右(在 32 位上更少)。

这限制了 2^27-1 的 32 位版本中最大可能的分配请求。最大扁平字符串长度为 ~2^28(512MB 空间),最大字符串长度为 2^29-1,因此这些限制都不能解决问题(如果它们确实存在,我们将抛出 Out-Of-Memory 异常) )。

请参阅:http : //code.google.com/p/v8/issues/detail?id=362#c9

就其他浏览器而言,这需要一些研究,例如查看 Firefox 的代码。但我怀疑我们能否为 IE/Opera 做同样的事情。

@slebetman OP 已经问到,“我可以安全地期望在浏览器中使用的 Javascript 中字符串的最大长度是多少?”。这是一个有效的问题,与询问“计算机有多少 RAM”完全不同。物理内存仅仅是一个限制因素。其他更严格的约束限制了字符串长度。现在,在 2015 年,当字符串长度为 2^28 个字符时,Chrome 仍然会崩溃。
2021-04-21 08:07:14
那么这种类型的信息真的没有中心区域吗?
2021-04-27 08:07:14
不是真的,但如果你达到这些限制,你很可能会做一些不适合浏览器环境的事情:) 虽然获取信息仍然很有趣,但正如我所说,你将不得不做一个在谷歌等上进行大量挖掘以找到它。
2021-05-04 08:07:14
@siebetman 确实如此,但我们在实践中受到实现或 CPU 架构的限制... cplusplus.com/reference/string/string/max_size 程序是否有设定的内存大小?如果我们要讨论这个“云中的一切”的想法,很多问题都很重要。
2021-05-12 08:07:14
与任何其他语言一样, askwhat is the maximum length of a string类似于 ask how mush RAM does the computer have实现可能会也可能不会限制它(例如 Chrome 的情况),但在一天结束时,字符串只是一个字节数组(实际上,在大多数 javascript 解释器中,它只是围绕空终止的一个薄包装器C 字符串)。
2021-05-13 08:07:14

ECMA 第 6.1.4 节对此进行了明确说明。

“String 类型是由零个或多个 16 位无符号整数值(“元素”)组成的所有有序序列的集合,最大长度为 2^53-1 个元素”

我在另一个答案中列出了一些典型的字符串限制基本上,您处于安全区域,字符串长度不超过 2 27 个字符。