调用此函数时,函数不会修改传递的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();
}
}
答案 0 :(得分:1)
您的代码不会在第一个函数中修改传递的数组,因为您重新声明了函数本身中的数组。这意味着丢失了对数组的原始引用,而是在函数内部修改了数组。如果您的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();
}
}
答案 1 :(得分:0)
重新初始化参数会破坏其引用:
arr = [];
将其长度设置为0不会破坏引用,并且将达到相同的目的:
arr.length = 0;