因此,有一天,当我在Stack Overflow中遇到这个问题并感到好奇时,我感到很奇怪:Maximum size of an Array in Javascript( JavaScript中数组的最大大小)。
问题是, JavaScript中数组的最大深度是什么?
按深度,我的意思是,在JavaScript放弃之前,您可以在数组中嵌套多少数组?
[1] // Depth Level: 1
[1, [2]] // Depth Level: 2
[1, [2, [3]]] // Depth Level: 3
[1, [...]] // Depth Level: x?
它是否与机器相关,是否基于编译器?
不,我不确定是否有任何实际用途,但是我仍然对此感到好奇。
答案 0 :(得分:3)
通常,您可以嵌套不同数组,直到内存用完为止,但是可以嵌套相同的数组并获得有效的无限深度数组。
var x = [ ];
x.push(x);
x[0][0][0](...)[0]; // Now valid
在大多数调试器中,它显示为[ [Circular] ]
,因为它是所谓的“循环引用”,因为数组包含自身。
这类似于您可以使用自引用对象的方式:
var x = { };
x.x = x;
// { x: [Circular] }
x.x.x.x.x.x.x.x.x(...).x; // Now valid
JavaScript本身并不真正在乎什么深度,该语言没有内在的限制。有时,循环引用是一种功能,例如x.y
指的是为了方便起见而回溯到x
的东西,这是一种表示相互关联的方式。从技术上讲,这是无限的深度,但您不太可能那样使用它。
这是该现象的简单示例:
var x = { };
var y = { };
x.y = y;
y.x = x;
x.y.x.y.x.y; // Pointless, but valid.
答案 1 :(得分:1)
tadman从运行时角度(无限深度)给出了answer,但是从编译时角度来看,有一个限制。 (据我所知)并不是JavaScript内置的,而是考虑编译器必须执行哪些操作来编译代码。
Get-Help
编译器需要将上面的表达式转换为abstract syntax tree。大概是:
[1, [2, [3]]]
如果在创建这些节点时编译器用尽了内存,因为节点/表达式太多,它将崩溃,并且您的程序将无法编译。就JavaScript而言,由于它使用的是JIT,所以我猜这是在运行时发生的编译错误。