学习Javascript中的forEach方法时出现的问题

Shu*_*ang 1 javascript

我从一周开始学习 Javascript,并尝试对循环进行一些练习,因此我尝试创建一个函数,每次调用它时,我都会将数组中的数字加倍。

我设法用经典的“for”循环来做到这一点,如下所示:

var numbers = [2, 5, 37, 500, 75]; 

function getDoubled() {
  for (var i = 0; i < numbers.length; i++) {
    (numbers[i] = numbers[i] * 2);
  }
}
Run Code Online (Sandbox Code Playgroud)

因此,每次调用该函数时,数组中的数字都会翻倍getDoubled();,现在我尝试对方法执行相同的forEach操作。

var numbers = [2, 5, 37, 500, 75];

function getDoubled(array) {
  array.forEach(function(number) {
    (number = number * 2);
  })
}
Run Code Online (Sandbox Code Playgroud)

但是当我调用该函数时,我无法更改数组getDoubled(numbers),但是如果我使用 进行测试console.log(number*2),它会在控制台中工作,所以我无法找出错误。

Cer*_*nce 6

重新分配标识符没有副作用。也就是说,someVariable = somethingNew只有当其他东西引用其中someVariable具有新值的 时,才会导致脚本的运行方式发生明显的变化。在这里,number = number * 2不执行任何操作,因为没有任何内容引用双倍number变量;重新分配参数不会对数组执行任何操作。

执行此操作的方法forEach是重新分配数组中的索引,就像在for循环中一样。

var numbers = [2,5,37,500,75];
function getDoubled(array) {
    array.forEach(function(number, i){
        array[i] = number * 2;
    })
}
getDoubled(numbers);
console.log(numbers);
Run Code Online (Sandbox Code Playgroud)

或者,更好的方法是使用更改后的值构造一个新数组,这可以使用 完成.map,它通过对原始数组的每个元素执行回调来创建一个新数组 - 这样您就不必查看获得所需输出的(不重要的)索引。

var numbers = [2,5,37,500,75];
function getDoubled(array) {
    return array.map(num => num * 2);
}
console.log(getDoubled(numbers));
Run Code Online (Sandbox Code Playgroud)