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 作为不与全局范围共享的参数发送)或对象克隆。
问题::
- 为什么在使用
x
初始化的 y
上执行推送时推送更改 x
?
- 这个例子发生在跨浏览器上,我想知道 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);
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.
如果你想克隆一个对象,有不同的方法来实现它,这取决于你想要浅克隆还是深克隆。这个信息很容易查到,我就不提供又一个实现了。
我发现了 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 作为不与全局范围共享的参数发送)或对象克隆。
问题::
- 为什么在使用
x
初始化的y
上执行推送时推送更改x
? - 这个例子发生在跨浏览器上,我想知道 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);
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 ony
initialized withx
?
因为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.
如果你想克隆一个对象,有不同的方法来实现它,这取决于你想要浅克隆还是深克隆。这个信息很容易查到,我就不提供又一个实现了。