Node.js中嵌套对象的最大级别是多少?

时间:2018-01-21 23:29:04

标签: node.js

现代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...

这是我想在一些边缘案例测试中使用的数字,并参考文档。

2 个答案:

答案 0 :(得分:3)

Javascript规范没有限制。

由于嵌入对象只是对另一个本身独立的对象的引用,因此除了某些整体内存或对象限制之外,可能没有编码限制。请记住,事物并没有真正嵌套在它们查找由解释器解析的对象文字中的方式。解析嵌入对象后,它就是自己的对象,而父对象只包含对该对象的引用(它实际上并不包含对象本身)。您也可以为许多其他变量分配相同的“嵌入式”引用。它只是一个对象参考。

对象文字声明的解析器限制也可能与整体内存使用量有关。同样,这将因实施和环境而异。

所以,如果你想在特定的JS引擎中找到一个特定的限制,你必须编写一个测试代码,看看你是否能找到一个限制,并且运行到一个限制可能根本不会与嵌套有关,但只是对象的数量和使用的内存。

答案 1 :(得分:0)

我不相信对嵌套有任何限制。无论如何,实施这样的限制可能太昂贵了。所以我的有根据的猜测是,它与node.js过程中符号总数的上限相同。