我是 javascript 新手,不太了解 push() 方法的工作原理。
我有两个空数组,row 和 newData。以及输出非常不同的两段代码:
for (i = 1; i <= 10 ; i++) {
row[0] = i;
newData.push(row);
}
Run Code Online (Sandbox Code Playgroud)
导致 newData == [10,10,10,...,10],我觉得这非常令人惊讶,并且
for (i = 1; i <= 10 ; i++) {
newData.push(i);
}
Run Code Online (Sandbox Code Playgroud)
结果 newData == [1,2,3,...,8,9,10] 这是预期的结果。
但我不明白为什么当第二个循环按预期工作时,第一个循环的每次迭代似乎都用最后一个元素替换 newData 的每个元素?
谢谢!
你的第一个片段:
var row = new Array();
var newData = new Array();
for (i = 1; i <= 10 ; i++) {
row[0] = i;
newData.push(row);
}
Run Code Online (Sandbox Code Playgroud)
推送 10 次对数组的引用,同时将该数组row的位置 0 中包含的值依次更改为值 1, 2, 3 .. 10,最终结果是设置数组的最终内容row数组到:[10]。
的实际最终值newData更正确地显示为:
[[10],[10],[10],[10],[10],[10],[10],[10],[10],[10]]
Run Code Online (Sandbox Code Playgroud)
而不是:
[10,10,10,...,10]
Run Code Online (Sandbox Code Playgroud)
在 JavaScript 中,将对象推入数组(在本例中为 Array 类的实例)实际上是将对象的引用推入数组。推送相同的变量row不会创建它的多个实例。
此处详细解释了此行为:JavaScript Is a pass-by-reference or pass-by-value language? .