我发现了一个问题/不良行为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作为参数发送,不与全局作用域共享)或对象克隆在哪里。
问题::
x
初始化的y
上执行推送时推送更改x
?也许我的问题很愚蠢,但我找不到记录在案的解释。
谢谢。
答案 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);
答案 2 :(得分:0)
var x = [];
创建一个Array对象,创建一个变量x
,并将指向Array对象的指针放在x
中。
var y = x;
创建变量y
,并将指向数组的指针从x
复制到y
。
现在两个变量都指向同一个Array对象。
现在用什么变量来推送是不重要的,将推送相同的Array对象。
如果需要使用不同的数组,则需要复制数组,而不是指针。也就是说,创建新的Array对象并使用其他Array对象中的值推送它。 (或者如果可以的话,使用一些复制功能)