考虑以下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]它停在什么深度?
答案 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也是这样做的。