【问题标题】:Argument's scope and object mutability in javascriptjavascript中参数的范围和对象可变性
【发布时间】:2015-06-10 10:47:26
【问题描述】:

我被分配了以下虚拟任务来了解 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);

【问题讨论】:

标签: javascript arrays scope mutability


【解决方案1】:

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

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

【讨论】:

  • 这并不能解释为什么第三种方法有效。如果参数按值传递,则不会使用参数“myArray”修改全局对象。
  • 参数按值传递。这并不意味着数组被复制。这两个值仍然引用原始数组,因此myArray[i] 修改了数组的内容。
【解决方案2】:

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

myArray[i] = x;

会改变原来的。但是,如果您将 myArray variable 设置为某个值,则原始数组将超出范围,您只需将局部变量设置为反转数组。 @dwickern's answer 为您提供了修复代码的正确思路。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-21
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 2021-11-13
    相关资源
    最近更新 更多