javascript中的参数范围和对象可变性

时间:2015-04-06 02:13:51

标签: javascript arrays scope mutability

我已经获得了以下虚拟作业,以了解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);

2 个答案:

答案 0 :(得分:2)

您的reverseArrayInPlace1reverseArrayInPlace2无法正常工作,因为参数是通过JavaScript中的值传递的。 myArray是函数的本地函数,并且重新分配它不会影响调用者。

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

复制数组

答案 1 :(得分:1)

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

myArray[i] = x;

将改变原件。但是,如果将myArray 变量设置为某个值,则原始数组将超出范围,并且您只将局部变量设置为反转数组。 @dwickern's answer为您提供修复代码的正确理念。