1
function reverseArray(array) {
    var reversed_array = [];
    for(var i = 0; i < array.length; i++) {
        reversed_array.unshift(array[i]);
    }

    return reversed_array;
}

function reverseArrayInPlace(array) {
    console.log(array); //[1,2,3,4,5] 

    array = reverseArray(array);
    console.log(arguments); //{0: [5, 4, 3, 2, 1]} this is good.
    console.log(array);    // [5, 4, 3, 2, 1] this is also good.
    return array;         //should return [5, 4, 3, 2, 1]   
}

console.log(reverseArray(["A", "B", "C"]));   //["C", "B", "A"]


var arrayValue = [1, 2, 3, 4, 5];
reverseArrayInPlace(arrayValue);

console.log(arrayValue);  // [1, 2, 3, 4, 5] *wrong*

这是我想用 reverseArrayInPlace() 的返回值覆盖变量 (arrayValue) 的问题,就像 array.reverse() 一样。

这是解决问题的方法

function reverseArrayInPlace(array) {

  var half = Math.floor(array.length / 2);

  for(var i = 0; i < half; i++) {
    var current = array[i];
    array[i] = array[array.length - 1 - i];
    array[array.length - 1 - i] = current;
  }

  console.log(array);    // [5, 4, 3, 2, 1] this is good.
  return array;         //should return [5, 4, 3, 2, 1]
}

var arrayValue = [1, 2, 3, 4, 5];
reverseArrayInPlace(arrayValue);

console.log(arrayValue);  // [5, 4, 3, 2, 1]   *it works!*

如果两个 reverseArrayInPlace() 函数都有一个具有相同值的返回语句,我不明白为什么这个解决方案可以用新值替换 (arrayValue)。

有人可以解释一下我对编程很陌生,谢谢!

4

3 回答 3

3

您的第一个代码示例的问题是:当您调用时,reverseArrayInPlace(arrayValue);您没有将该函数调用的结果分配给arrayValue,因此arrayValue不会改变。

arrayValue = reverseArrayInPlace(arrayValue);

会解决的。

现在为什么reverseArrayInPlace第一个示例中的函数不会更改实际的数组元素,但第二个示例会:

当您将数组作为变量传递给函数时,它是通过引用而不是值传递的,因此您实际上是将指针 ( array) 传递给函数,它将使用该指针来访问数组的实际内容。这个引用只存在于函数的范围内,所以改变它不会影响实际的数组。

array = reverseArray(array);

在这里,您正在更改此引用,但此更改仅适用于reverseArrayInPlace函数内部,因此不会更改您的实际数组。但是,在您的第二个示例中,您正在直接访问原始数组并更改其元素。这就是为什么您的第二个示例有效,而您的第一个示例无效的原因。

于 2016-05-07T20:49:33.447 回答
0

您刚刚调用了 reverseArrayInPlace 并忘记更新 arrayValue:

var arrayValue = [1, 2, 3, 4, 5];
//reverseArrayInPlace(arrayValue);
arrayValue= reverseArrayInPlace(arrayValue);

另一方面,在第二个示例中,数组直接更新,在第一个示例中,您正在创建一个新的数组实例(使用第三方函数时)

于 2016-05-07T20:45:27.827 回答
0

在您的第一个示例中,您要声明一个新变量var reversed_array = [];来保存反转的数据,然后从函数中返回它,但不要使用返回值。

var array = reverseArray(array);

在第二个例子中,reverseArrayInPlace()函数实际上是在操作传入函数的数组,这就是为什么你可以在你传入的array变量中看到反转的数据。

第二个示例也应该在没有的情况下工作,return array;因为它直接在变量中操作数据。

于 2016-05-07T20:48:45.550 回答