JavaScript中数组的最大深度
所以,有一天,当我在堆栈溢出中遇到这个问题时,我进行了一次实验,并感到好奇:(JavaScript中数组的最大大小) 问题是,JavaScript中数组的最大深度是多少 我所说的深度是指在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?
[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字节即可。