我已经获得了以下虚拟作业,以了解JavaScript中的范围和可变性:
在本练习中,编写两个函数,reverseArray和reverseArrayInPlace。第一个是reverseArray,它将一个数组作为参数,并生成一个新的数组,该数组具有相反顺序的相同元素。第二个是reverseArrayInPlace,它执行反向方法的工作:它修改作为参数给出的数组,以便反转其元素。两者都不能使用标准的反向方法。
我成功编写了reverseArray函数,并希望将其重用于reverseArrayInPlace函数。我编写了3个版本的函数,我真的不明白为什么有些工作,有些人不知道。我将不胜感激任何有关此JavaScript行为的解释。 (我知道还有其他方法可以解决reverseArrayInPlace,但我想知道为什么我的方法不起作用。)
// Reverses an array given as argument and returns it as a NEW array.
function reverseArray(myArray){
var reversedArray = [];
for(var i=0; i<myArray.length; i++){
reversedArray.unshift(myArray[i]);
}
return reversedArray;
}
/*
Reverse the original array in place
*/
// DOESN'T WORK
function reverseArrayInPlace1(myArray){
myArray = reverseArray(myArray);
}
// DOESN'T WORK
function reverseArrayInPlace2(myArray){
var original = [];
for (var i=0; i<myArray.length; i++) {
original[i]=myArray[i];
}
myArray = reverseArray(original);
}
// WORKS
function reverseArrayInPlace3(myArray){
var original = [];
for (var i=0; i<myArray.length; i++) {
original[i]=myArray[i];
}
var newArray = reverseArray(original);
for (var i=0; i<myArray.length; i++) {
myArray[i]=newArray[i];
}
}
miArreglo = ["a", "b", "c", "d" ];
console.log("MyArray: ", miArreglo);
arregloRever=reverseArray(miArreglo);
console.log("Reversed using reverseArray: ", arregloRever);
reverseArrayInPlace1(miArreglo);
console.log("Reversed using reverseArrayInPlace1: ",miArreglo);
reverseArrayInPlace2(miArreglo);
console.log("Reversed using reverseArrayInPlace2: ",miArreglo);
reverseArrayInPlace3(miArreglo);
console.log("Reversed using reverseArrayInPlace3: ",miArreglo);
答案 0 :(得分:2)
您的reverseArrayInPlace1
和reverseArrayInPlace2
无法正常工作,因为参数是通过JavaScript中的值传递的。 myArray
是函数的本地函数,并且重新分配它不会影响调用者。
您可以采用相反的方法重用代码,并根据reverseArray
实施reverseArrayInPlace
。您将复制输入数组,将副本反转到原位并返回。 (您可以通过调用arr.slice()
)
答案 1 :(得分:1)
在函数内部,myArray
是一个引用原始数组的变量,因此您对元素所做的任何更改,例如
myArray[i] = x;
将改变原件。但是,如果将myArray
变量设置为某个值,则原始数组将超出范围,并且您只将局部变量设置为反转数组。 @dwickern's answer为您提供修复代码的正确理念。