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

我发现一个问题/不良行为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. 为什么在用y初始化y时执行推送时推送x
  2. 这个例子发生在跨浏览器,我想知道如果node.js做同样惊喜,现在的问题:我使用错误的.push()方法? 什么是从现有的对象初始化正确的方法。

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

谢谢。

为什么在用y初始化y时执行推送时推送x

因为y不是“用x初始化” ,所以 x 。 在Javascript中,所有variables都包含引用 (除了原始值,例如string或数字)。

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

这个例子发生在跨浏览器,我想知道如果node.js做同样惊喜,

当然。 这是规范的方式。

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

是。 (好吧,不,你正确的使用它,你只是想错了。)

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

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

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

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

 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 = [];

创build一个数组对象,创build一个variablesx ,并将指向该数组对象的指针放入x

var y = x;

创build一个variablesy ,指向数组的指针从x复制到y 。 现在这两个variables指向相同的数组对象。

不pipe现在使用什么variables来推送,相同的数组对象将被推送。

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