Почему функция не будет изменять этот массив - PullRequest
0 голосов
/ 01 февраля 2019

Функция не будет изменять переданный 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();
  }
}

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Повторная инициализация параметра уничтожает его ссылку:

arr = [];

Установка его длины в 0 приведет к не разрушению ссылки, и она будет служить той же цели:

arr.length = 0;
0 голосов
/ 01 февраля 2019

Ваш код не изменяет переданный массив в вашей первой функции, потому что вы переопределяете, какой массив находится внутри самой функции.Это означает, что исходная ссылка на массив теряется, и вместо этого вы модифицируете массив внутри функции.Если ваше return arr в конце вашей функции, вы заметите, что внутренний массив фактически изменился.

Во втором примере вы передаете массив в свою функцию, но не делаете повторное выделение его, позволяяВаш цикл for действует на переданный массив.

Таким образом, если вы придерживаетесь кода в первом примере и добавляете return arr после цикла for, вы можете получить новый массив в вашем 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();
  }
}
...