我有两个接受数组作为参数的函数,这些函数做了一个简单的工作,使数组的所有元素都为零。
使用forEach()
方法并将回调传递给它的第一个函数:
function pass_arr(x)
{
x.forEach(function(y){
y = 0;
});
}
我这样说:
var a = ["a", "b", 1, 3, "stringg"];
pass_arr(a);
然后打印数组a的内容:
for(var i = 0; i < a.length; i++)
{
console.log(a[i]);
}
我使用node:
执行此操作 #nodejs func.js
得到了结果
a
b
1
3
stringg
使用普通函数调用的第二个函数:
function pass_arr(x)
{
for(var i = 0; i < a.length; i++)
{
x[i] = 0;
}
}
var a = ["a", "b", 1, 3, "stringg"];
pass_arr(a);
for(var i = 0; i < a.length; i++)
{
console.log(a[i]);
}
#node func.js
得到了结果:
0
0
0
0
0
As far as i know when we pass an array to a function, then we do
通过引用传递and thus we can modify the content of the array inside the function.
我的问题是为什么第一个函数没有正确归零数组的内容?请给出一些明确的解释?
答案 0 :(得分:0)
在这段代码中:
function pass_arr(x)
{
x.forEach(function(y){
y = 0;
});
}
y
只是回调的一个参数(它与实际的数组项是分开的),因此赋值给它只会改变参数的值。它对阵列没有影响。
如果要修改数组,则必须引用该数组:
function pass_arr(x)
{
x.forEach(function(y, index, array){
array[index] = 0;
});
}
答案 1 :(得分:0)
您要为该值分配0
。使用索引(此处为i
)替换实际元素。
试一试:
function pass_arr(x) {
x.forEach(function (value, i) {
x[i] = 0;
});
}
var a = ["a", "b", 1, 3, "stringg"];
pass_arr(a);
console.log(a.join("\n"));
答案 2 :(得分:0)
x
指向同一个数组,因此使用x[i] =
将写入x
的第i个元素。当您使用.forEach
,y
时,对于数组,回调的参数是原语。如果写入基元,则不会更改原始数组。也就是说,你不能通过写入基元来使用.forEach
来改变原始数组。但是,您仍然可以以相同的方式更改原始数组:
x.forEach((y, idx) => x[idx] = 0);
这有些不相关,但实现此目的的方法是使用.map
。
x = ["a", "b", 1, 3, "stringg"].map(function (y) { return 0; });
我想指出,在多维数组中,回调所采用的参数不是数组元素的副本,而是指向原始元素。
let x = [[0]];
x.forEach(y => y[0] = 1);
// x is now [[1]]
另请注意,JavaScript(以及Java和许多其他语言)不是传递引用语言。所有参数都是通过值传递的 - 只是对象和数组通过自身传递的引用存储在变量中。这使您可以在函数中改变它们的属性。
答案 3 :(得分:0)
第一个功能相当于:
for(var i = 0; i < a.length; i++)
{
y = x[i];
y = 0;
}
}
因此y
被覆盖为单独的变量。
您可以使用forEach
的索引参数来获得预期的行为:
x.forEach(function(y, index, arr){
arr[index] = 0;
});
无论哪种方式,您都必须将0
分配给array[i]
,而不是分配给array[i]