Javascript 为什么函数不修改此数组

Javascript 为什么函数不修改此数组,javascript,arrays,pass-by-reference,pass-by-value,Javascript,Arrays,Pass By Reference,Pass By Value,调用此函数时,函数不会修改传递的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:

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]++;
  }
}
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();
  }
}
我就是这样用的。控制台显示[]

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,您将注意到内部数组实际上已经更改

在第二个示例中,将数组传递到函数中,但不重新声明它,从而允许for循环对传入的数组进行操作

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

function testy(arr) {

  for (let i = 0; i < arr.length; i++) {
    arr[i]++;
  }
}
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();
  }
}

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

arr = [];
将其长度设置为0不会破坏引用,其作用相同:

arr.length = 0;

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