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*

これが、array.reverse() と同じように、reverseArrayInPlace() の戻り値で変数 (arrayValue) をオーバーライドしたい問題です。

ここに問題の解決策があります

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()関数に同じ値のreturnステートメントがある場合、このソリューションが(arrayValue)を新しい値に置き換えるのに機能する理由がわかりません。

誰かが私がプログラミングにかなり慣れていないことを説明してもらえますか、ありがとう!

4

3 に答える 3

3

最初のコード例の問題は次のとおりです。呼び出すときreverseArrayInPlace(arrayValue);に、その関数呼び出しの結果を に割り当てていないarrayValueため、arrayValue変更されません。

arrayValue = reverseArrayInPlace(arrayValue);

それを解決します。

reverseArrayInPlace最初の例の関数が実際の配列要素を変更しない理由については、次のとおりです。

配列を変数として関数に渡す場合、値ではなく参照によって渡されるため、基本的arrayに関数にポインター ( ) を渡します。このポインターを使用して、配列の実際のコンテンツにアクセスします。この参照は関数のスコープ内にのみ存在するため、変更しても実際の配列には影響しません。

array = reverseArray(array);

ここでは、この参照を正確に変更していますが、この変更は関数内でのみ適用されるreverseArrayInPlaceため、実際の配列は変更されません。ただし、2番目の例では、元の配列に直接アクセスし、その要素を変更しています。これが、2 番目の例が機能し、最初の例が機能しない理由です。

于 2016-05-07T20:49:33.447 に答える
0

最初の例では、逆のデータを保持する新しい変数を宣言しvar reversed_array = [];てから、関数からそれを返しますが、戻り値は使用しません。

var array = reverseArray(array);

2 番目の例では、reverseArrayInPlace()関数は実際に関数に送信された配列を操作しています。これが、array送信した変数の反転データを確認できる理由です。

この 2 番目の例はreturn array;、変数内のデータを直接操作するため、なくても機能するはずです。

于 2016-05-07T20:48:45.550 に答える