现代Node.js中版本4.x及更高版本中对象的最大嵌套深度是多少?
{a: {b: {c: {d: {e: {}}}}}}
我已经实现了一个可以解析深层嵌套对象的算法,这些对象开始在400到500万级别之间失败,显示:
<--- Last few GCs --->
22269 ms: Scavenge 1474.2 (1532.4) -> 1474.2 (1532.4) MB, 2.0 / 0 ms (+ 1.0 ms in 1 steps since last GC) [allocation failure] [incremental marking delaying mark-sweep].
22818 ms: Mark-sweep 1474.2 (1532.4) -> 1474.2 (1532.4) MB, 549.2 / 0 ms (+ 1.0 ms in 1 steps since start of marking, biggest step 1.0 ms) [last resort gc].
23365 ms: Mark-sweep 1474.2 (1532.4) -> 1474.2 (1532.4) MB, 547.7 / 0 ms [last resort gc].
<--- JS stacktrace --->
==== JS stack trace =========================================
Security context: 0000021BC90373A9 <JS Object>
1: split(aka split) [native string.js:~420] [pc=00000130CB0F8AE4] (this=000000DFECA04101 <Very long string[38888893]>,ay=0000021BC9004EB1 <String[1]: .>,az=0000021BC9004131 <undefined>)
2: arguments adaptor frame: 1->2
3: getIfHas [..\lib\utils\index.js:165] [pc=00000130CB137703] (this=0000006F2C894621 <an Object with map 0000015A54F5B6B1>,obj=...
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory
有没有我可以参考的官方数字One shall not go deeper than...
?
这是我想在一些边缘案例测试中使用的数字,并参考文档。
答案 0 :(得分:3)
Javascript规范没有限制。
由于嵌入对象只是对另一个本身独立的对象的引用,因此除了某些整体内存或对象限制之外,可能没有编码限制。请记住,事物并没有真正嵌套在它们查找由解释器解析的对象文字中的方式。解析嵌入对象后,它就是自己的对象,而父对象只包含对该对象的引用(它实际上并不包含对象本身)。您也可以为许多其他变量分配相同的“嵌入式”引用。它只是一个对象参考。
对象文字声明的解析器限制也可能与整体内存使用量有关。同样,这将因实施和环境而异。
所以,如果你想在特定的JS引擎中找到一个特定的限制,你必须编写一个测试代码,看看你是否能找到一个限制,并且运行到一个限制可能根本不会与嵌套有关,但只是对象的数量和使用的内存。
答案 1 :(得分:0)
我不相信对嵌套有任何限制。无论如何,实施这样的限制可能太昂贵了。所以我的有根据的猜测是,它与node.js过程中符号总数的上限相同。