JavaScript中数组的最大深度

JavaScript中数组的最大深度,javascript,arrays,Javascript,Arrays,所以,有一天,当我在堆栈溢出中遇到这个问题时,我进行了一次实验,并感到好奇:(JavaScript中数组的最大大小) 问题是,JavaScript中数组的最大深度是多少 我所说的深度是指在JavaScript放弃之前,你能在数组中嵌套多少数组 [1] // Depth Level: 1 [1, [2]] // Depth Level: 2 [1, [2, [3]]] // Depth Level: 3 [1, [...]] // Depth Level: x?

所以,有一天,当我在堆栈溢出中遇到这个问题时,我进行了一次实验,并感到好奇:(JavaScript中数组的最大大小)

问题是,JavaScript中数组的最大深度是多少

我所说的深度是指在JavaScript放弃之前,你能在数组中嵌套多少数组

[1]           // Depth Level: 1
[1, [2]]      // Depth Level: 2
[1, [2, [3]]] // Depth Level: 3
[1, [...]]    // Depth Level: x?
它是否依赖于机器,是否基于编译器

不,我不确定这是否有任何实际用途,但这仍然是我好奇的地方。

通常可以嵌套不同的数组,直到内存耗尽,但可以嵌套相同的数组,并得到有效的无限深度数组

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.
tadman从运行时的角度(无限深度)给出了一个示例,但从编译时的角度来看,有一个限制。它不是一个内置到JavaScript中的(据我所知),而是考虑编译器为了编译您的代码所做的事情。
[1, [2, [3]]]
编译器需要将上述表达式转换为一个表达式。大致:

[ , ]
 /\
1 [ , ]
   /\
  2 [3]

如果编译器在创建这些节点时内存不足,因为节点/表达式太多,那么它将崩溃,程序将无法编译。就JavaScript而言,由于它使用了,我猜这是在运行时发生的编译错误;x[0]=y-infinite.Or,
x=[];x、 推(x)也会生成一个无限深度的数组。奇怪的是,数组长度有限制,但深度没有限制。无论如何,谢谢。非常感谢您的回答。@Lapys数组长度表示为一个无符号32位整数,因此长度必须能够容纳4个字节。对于深度,实际上不需要有限制。如果
x.x
只是指向它自己,那么它从
x
的地址获取东西并返回给您就没有问题了。@pushkin虽然这是一个很好的观点,但在64位版本的JavaScript中仍然是这样吗?这听起来像是一个实现上的怪癖,除非它是在标准中定义的,所以它更可能是一个实际的限制,而不是一个理论上的限制。@tadman我不确定你所说的64位版本的JavaScript是什么意思。根据调查,这是真的。关于最大长度,是的,这是一个可以改变的实际限制。@tadman啊。根据文件,似乎是这样的。我想好处在于,您不必担心不同系统上的不同行为,只需将其修复为4字节即可。