繁体   English   中英

为什么array.push()似乎无限次推?

[英]Why does array.push() seem to push infinite times?

考虑以下javascript代码,

>> a = [1, 2]
  Array [ 1, 2 ]

>> a.push(a) 
  Array [ 1, 2, Array[3] ] 

在扩展数组a ,我们得到一个具有无限深度的数组。 (在firefox开发者控制台上查看)

Array[3]
| 0: 1
| 1: 2
  2: Array[3]
  | 0: 1
  | 1: 2
  | 2: Array[3]
    | 0: 1
    | 1: 2
    | 2: Array[3]
    ....

[1]为什么不止一次附加?
[2]它停在什么深度?

它被推了一次。 当数组引用自身( 循环引用)时,您会看到多个插入的数组。 显示取决于浏览器。

如果您尝试获取JSON字符串,则JSON.stringify会因错误JSON.stringify中断

 Circular reference in value argument not supported 

 var a = [1, 2] console.log(a); a.push(a); console.log(a); JSON.stringify(a); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

它没有被推动无数次。 这是Firefox Developer Console如何呈现元素的问题。 扩展数组并再次单击它本身,将始终显示数组的外观。 所以你可以扩展它并无限次点击它,但是,它只有一次

您已经创建了循环引用。

当您将数组推送到自身时,数组中的最后一个元素将成为对整个数组的引用 - 包括最后一个元素。 因此,最后一个元素中的最后一个元素也是对整个数组的引用,依此类推。

它是无限的,就像一个圆圈是无限的,并且“不止一次地追加”只是在同一意义上,如果你不止一次绕过一个圆圈,你会不止一次地击中同一个地方。

因为javascript提供了对'a'变量的引用,而不是实际的对象,所以如果你将a推到自身,你可以推送保存对象的内存地址,并创建一个循环引用。

[1,2, 参考此对象 ]

它实际上只推动了一次。 它不会推送数组元素,而是推送数组的地址。 Firefox控制台只是试图显示其中的内容,但最终会无限地显示相同的内容。

不仅仅是Firefox,Chrome也是如此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM