javascript chrome控制台中带有push()方法的无限内部数组

javascript chrome控制台中带有push()方法的无限内部数组,javascript,arrays,google-chrome-console,Javascript,Arrays,Google Chrome Console,最近,我在javascript中试验数组push()方法。 我创建了一个数组,并使用push方法推送相同的数组 var a=['hello', 4] a.push(a) 结果令人惊讶,当我在chrome控制台中探索数组项时,产生了无限数组。我想知道为什么会这样。由于push()方法在最后添加元素 我期待着这个结果 ['hello, 4, ['hello',4]] 但结果是另一回事,这是chrome控制台的屏幕截图 当您在Javascript(事实上在大多数类似语言中)中将对象分配给变量时

最近,我在javascript中试验数组
push()
方法。 我创建了一个数组,并使用push方法推送相同的数组

var a=['hello', 4]

a.push(a)

结果令人惊讶,当我在chrome控制台中探索数组项时,产生了无限数组。我想知道为什么会这样。由于
push()
方法在最后添加元素

我期待着这个结果

['hello, 4, ['hello',4]]
但结果是另一回事,这是chrome控制台的屏幕截图

当您在Javascript(事实上在大多数类似语言中)中将对象分配给变量时,该变量包含对该对象的所谓“引用”。请注意,JS中的数组是对象,但字符串和数字等基本值不是

对象赋值“通过引用”的一个结果是,您对该对象所做的任何更改(即使它对碰巧引用同一对象的另一个变量所做的更改)都将在检查原始变量时“显示”

在这里,你从

var a=['hello', 4]
然后呢

a.push(a)
然后,
a
指向的对象(数组)已更改。现在它的末尾有一个额外的元素,即
a
,就是我们所说的同一个数组

所以它递归地展开:

a = ['hello', 4, a]
  = ['hello', 4, ['hello', 4, a]]
  = ['hello', 4, ['hello', 4, ['hello', 4, a]]]
   ...

等等,无限地。这并不需要无限大的内存,因为数组的第三个元素只是对保存数组的内存位置的引用。

我认为Robin完全描述了发生这种情况的原因。我想补充一点,您可以使用javascript中的rest参数将数组的元素添加到另一个数组中。 在下文中,我举了一个此类参数的示例:

let name=[“约翰”,“萨拉”];
name.push(…name);

console.log(名称)
Try:
a.push([…a])
Hi-anlijudavid,你能详细说明一下这个代码是如何工作的吗?我对数组前面的“…”符号感到困惑name@Diwakar我在我的回答中解释了anlijudavid注释的用法,您可以查看。我想知道这个符号的用法:[…a]
..
=Destructuring()
a.push([…a])
相当于复制
a
的所有对象,然后
推送到
a
对象。但是如果我继续检查数组,是否需要更多内存来显示数组?或者只是打印出来而不在内存中保存任何内容?我不确定这些值的浏览器控制台表示形式到底是如何工作的(在不同的浏览器中可能会有所不同),但当然,至少在理论上,扩展的越多,就需要越多的内存来保存所看到的所有内容。不过,我并不认为这是一个实际问题。您好,negin,您提供的代码将导致与self数组连接,并更改预期的数组长度。我试图推动self数组,这意味着数组的长度应该是它之前值的+1