重复对象中的Array.push(),不正确或无法理解

Array.push() in duplicated object, incorrect or incomprehensible

本文关键字:不正确 对象 push Array      更新时间:2023-09-26

我发现了一个问题/错误行为Array.push()。我不确定我是做错了什么,还是.push()方法不正确。

我将举一个我正在处理的小例子

var x = [];
function test()
{
  var y = x;
  for(var i = 1; i<10; i++)
  {
    y.push(i);
  }
  alert("x = " + x);
}
alert("x = " + x);
test();
//result:
//1'st alert: x =
//2'rd alert: x = 1,2,3,4,5,6,7,8,9

因此,我的例子与我在项目中遇到的真正问题相比是无与伦比的小,我确实解决了它:添加方法参数(x作为参数发送,不与全局范围共享)或对象克隆。

问题:

  1. 在用x初始化的y上执行推送时,为什么要推送更改x
  2. 这个例子发生在跨浏览器上,我想知道node.js是否也能做到这一点。现在的问题是:我使用了错误的.push()方法?从现有对象初始化对象的正确方法是什么

也许我的问题是愚蠢的,但我找不到有记录的解释。

谢谢。

在用x初始化的y上执行推送时,为什么要推送更改x

因为y不是用x"初始化的,所以它x。在Javascript中,所有变量都包含引用(基本值除外,如字符串或数字)。

x是一个数组的名称。声明y = x;只是为同一数组创建另一个名称。

这个例子发生在跨浏览器上,我想知道node.js是否也能做到这一点

当然。这样符合规格。

现在的问题是:我使用了错误的.push()方法?

是的。(好吧,不,你用对了,你只是预料错了。)

从现有对象初始化对象的正确方法是什么。

如果你想克隆一个对象,有不同的方法来实现它,这取决于你想要浅克隆还是深克隆。这些信息可以很容易地查找,我不会再提供另一个实现。

相关搜索:https://stackoverflow.com/search?q=javascript+克隆+对象

发生这种情况是因为您在执行第二个警报后调用了该函数。空结果来自函数外的警报,第二个结果来自函数内的警报。这应该能正常工作:

var x = [];
function test()
{
  var y = x;
  for(var i = 1; i<10; i++)
  {
    y.push(i);
  }
  alert("x = " + x);
}
test();
alert("x = " + x);

Jsfddle

var x = [];

创建一个Array对象,创建一个变量x,并将指向Array对象的指针放在x中。

var y = x;

创建一个变量y,并将指向数组的指针从x复制到y。现在,两个变量都指向同一个Array对象。

现在,使用什么变量来推送并不重要,将推送相同的Array对象。

如果需要不同的数组,则需要复制数组,而不是指针。也就是说,创建新的Array对象,并使用其他Array对象的值推送它。(或者使用一些复制功能(如果可用)