【问题标题】:Why function won't modify this array为什么函数不会修改这个数组
【发布时间】:2019-06-25 23:05:57
【问题描述】:

调用此函数时,函数不会修改传递的arr:

const animalTypes = [
  new Animal( "wolf", "audio/wolf.mp3" ),
  new Animal( "frog", "audio/frog.wav" ),
  new Animal( "cow", "audio/cow.mp3" ),
  new Animal( "snake", "audio/snake.mp3" ) 
];

function randomAnimalArray( arr, n ) {
  arr = [];
  for ( let i = 0; i < n; i++ ) {
    arr.push( animalTypes[ Math.floor( Math.random() * animalTypes.length ) ] );
  }
}

但是调用这个函数的时候会这样:

function testy(arr) {

  for (let i = 0; i < arr.length; i++) {
    arr[i]++;
  }
}

我就是这样用的。控制台显示 []

let solutionArr = [], guessesArr = [];

function computerIsPlaying() {
  let animalNumberEl = document.getElementById("animals-number");
  randomAnimalArray(solutionArr, animalNumberEl.value);
  console.log(solutionArr);
  for (let i = 0; i < solutionArr.length; i++) {
    solutionArr[i].makeSound();
  }
}

【问题讨论】:

  • 这是什么语言的?这是一种至关重要的信息,所以请将其添加为标签。
  • 因为您正在用arr = [] 中的新数组替换传入的任何数组。您不能修改 变量 arr 通过引用

标签: javascript arrays pass-by-reference pass-by-value


【解决方案1】:

重新初始化参数会破坏它的引用:

arr = [];

将其长度设置为 0 将不会破坏引用,并且将起到相同的作用:

arr.length = 0;

【讨论】:

    【解决方案2】:

    您的代码不会修改第一个函数中传递的数组,因为您在函数本身中重新声明了哪些数组。这意味着对数组的原始引用会丢失,而是在函数内部修改数组。如果你的函数末尾有return arr,你会注意到内部数组实际上已经改变了。

    在您的第二个示例中,您将数组传递给您的函数,但没有重新声明它,从而允许您的 for 循环作用于传入的数组。

    因此,如果您坚持使用第一个示例中的代码并在 for 循环后添加 return arr,则可以在 computerIsPlaying 函数中获取新数组:

    function computerIsPlaying() {
      let animalNumberEl = document.getElementById("animals-number");
      solutionArr = randomAnimalArray(solutionArr, animalNumberEl.value);
      console.log(solutionArr);
      for (let i = 0; i < solutionArr.length; i++) {
        solutionArr[i].makeSound();
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      • 2019-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-08
      • 1970-01-01
      相关资源
      最近更新 更多