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

时间:2017-08-10 11:23:37

标签: javascript

考虑以下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]它停在什么深度?

5 个答案:

答案 0 :(得分:3)

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

如果您尝试获取JSON字符串,则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; }

答案 1 :(得分:1)

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

答案 2 :(得分:1)

您已创建循环引用。

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

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

答案 3 :(得分:0)

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

[1,2,对此对象的引用]

答案 4 :(得分:0)

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

不仅仅是Firefox,Chrome也是这样做的。