Array.push() 在重复的对象中,不正确或难以理解

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

我发现了 issue/bad 行为 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() 方法?从现有对象初始化对象的正确方法是什么。

也许我的问题很愚蠢,但我找不到文档解释。

谢谢。

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

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

test();

alert("x = " + x);

Jsfiddle

var x = [];

创建了一个Array对象,创建了一个变量x,并将指向Array对象的指针放入x

var y = x;

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

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

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

Why push change x when the push is performed on y initialized with x?

因为y不是"initialized with x",所以x。在 Javascript 中,所有变量都包含 引用 (原始值除外,如字符串或数字)。

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

This example happens cross browsers, and I wondered if node.js do the same well surprise it does,

当然可以。规范中就是这样。

now the question: I'm using wrong .push() method?

是的。 (好吧,不,你用对了,你只是期望错了。)

And what is the correct approach to initialize objects from existing ones.

如果你想克隆一个对象,有不同的方法来实现它,这取决于你想要浅克隆还是深克隆。这个信息很容易查到,我就不提供又一个实现了。

相关搜索:https://whosebug.com/search?q=javascript+clone+object