JavaScript中数组的最大深度

时间:2018-06-27 21:10:13

标签: javascript arrays

因此,有一天,当我在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?

它是否与机器相关,是否基于编译器?

不,我不确定是否有任何实际用途,但是我仍然对此感到好奇。

2 个答案:

答案 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,所以我猜这是在运行时发生的编译错误。