2016-05-07 1 views
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()のように、変数(arrayValue)をreverseArrayInPlace()の戻り値でオーバーライドしたいという問題です。両方reverseArrayInPlace()関数が持つreturn文を持っている場合場所での配列の反転なぜそれは機能しませんか?

、ここでは、このソリューションが新しい値で(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!* 

が、私は理解していない問題の解決策です同じ値。

誰かが私はかなりプログラミングに新しいです、ありがとう!

+0

多分あなたはカスタム機能のためにこれを必要としますが、jsには逆の配列が組み込まれていますか? console.log([1、2、3、4、5])。逆()) – yezzz

答えて

3

あなたの最初のコード例に問題はこれです:あなたはreverseArrayInPlace(arrayValue);あなたがarrayValueにその関数呼び出しの結果を代入していないので、arrayValueは変更されません呼び出すとき 。

arrayValue = reverseArrayInPlace(arrayValue); 

となります。

今、あなたの最初の例ではreverseArrayInPlace関数は、実際の配列要素を変更しませんが、2番目の例ではない理由のために:

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

array = reverseArray(array); 

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

+0

OPは、これについての詳細については、受け入れられた回答[ここ](http://stackoverflow.com/questions/13104494/does-javascript-pass-by-reference)を参照することができます –

+0

ohhhhhh私は、ありがとうございます! !2番目の例は、変数の値に直接アクセスして値を変更しています(私は気付いていましたが、正確にはどういうことかはわかりませんでした)。 – Yandri

0

あなただけreverseArrayInPlaceと呼ばれ、arrayValue更新するのを忘れ:一方

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

を、使用するときに最初のもので、あなたは配列(の新しいインスタンスを作成しているところ第二の例では、配列を直接更新していますサードパーティ関数)

0

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

var array = reverseArray(array);

reverseArrayInPlace()機能は、実際にはあなたが送っarray変数で逆転したデータを見ることができる理由です、関数に送られ、配列を操作している。

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

+0

戻り値なしでうまくいきました。なぜなら、戻り値がどこにでも格納されていないので、どうしてか分かりました。 – Yandri

関連する問題