Javascript将数组作为参数传递给函数

时间:2015-06-28 22:16:18

标签: javascript arrays callback

我有两个接受数组作为参数的函数,这些函数做了一个简单的工作,使数组的所有元素都为零。

使用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.

我的问题是为什么第一个函数没有正确归零数组的内容?请给出一些明确的解释?

4 个答案:

答案 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个元素。当您使用.forEachy时,对于数组,回调的参数是原语。如果写入基元,则不会更改原始数组。也就是说,你不能通过写入基元来使用.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]

值的单独变量