2

我被分配了以下虚拟任务来了解 JavaScript 中的范围和可变性:

对于本练习,编写两个函数,reverseArray 和 reverseArrayInPlace。第一个,reverseArray,将一个数组作为参数并生成一个新数组,该数组以相反的顺序具有相同的元素。第二个,reverseArrayInPlace,执行 reverse 方法所做的事情:它修改作为参数给出的数组以反转其元素。两者都不能使用标准的反向方法。

我成功编写了 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);
4

2 回答 2

2

你的reverseArrayInPlace1andreverseArrayInPlace2不起作用,因为参数在 JavaScript 中是按值传递的。myArray是函数本地的,重新分配它不会影响调用者。

您可以采取相反的方法来重用您的代码,并reverseArray根据reverseArrayInPlace. 您将复制输入数组,将副本反转并返回。(您可以通过调用复制数组arr.slice()

于 2015-04-06T03:04:10.947 回答
1

在您的函数内部,myArray是一个引用原始数组的变量,因此您对元素所做的任何更改,例如

myArray[i] = x;

会改变原来的。但是,如果您将myArray 变量设置为某个值,则原始数组将超出范围,并且您只是将局部变量设置为反转数组。@dwickern 的回答为您提供了修复代码的正确想法。

于 2015-04-06T03:09:43.643 回答