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

时间:2015-02-25 07:36:35

标签: javascript arrays node.js browser

我发现了一个问题/不良行为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()方法?什么是从现有对象初始化对象的正确方法。
  3. 也许我的问题很愚蠢,但我找不到记录在案的解释。

    谢谢。

3 个答案:

答案 0 :(得分:1)

  

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

由于y不是&#34;已使用x&#34; 初始化,因此 x。在Javascript中,所有变量都包含引用(原始值除外,如字符串或数字)。

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

  

这个例子发生在跨浏览器上,我想知道node.js是否也做了同样的惊喜,

当然。它就是那种规格。

  

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

是。 (嗯,不,你正确地使用它,你只是期待错误的事情。)

  

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

如果要克隆对象,可以使用不同的方法,具体取决于您是想要浅层还是深层克隆。这些信息可以轻松查找,我不会提供另一个实现。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

var x = [];

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

var y = x;

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

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

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