2

JavaScript のスコープと可変性について学ぶために、次のダミーの割り当てが与えられました。

この演習では、reverseArray と reverseArrayInPlace の 2 つの関数を記述します。最初の reverseArray は、配列を引数として取り、同じ要素を逆の順序で持つ新しい配列を生成します。2 番目の 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);
4

2 に答える 2

2

reverseArrayInPlace1JavaScript では引数が値で渡されるため、 andは機能しませreverseArrayInPlace2ん。myArray関数に対してローカルであり、それを再割り当てしても呼び出し元には影響しません。

コードの再利用に対して反対のアプローチを取りreverseArrayreverseArrayInPlace. 入力配列をコピーし、そのコピーを反転して返します。( を呼び出して配列をコピーできますarr.slice())

于 2015-04-06T03:04:10.947 に答える
1

関数内にmyArrayは、元の配列を参照する変数があるため、要素に加えた変更は、たとえば

myArray[i] = x;

オリジナルを変更します。ただし、myArray 変数を何かに設定すると、元の配列はスコープから除外され、ローカル変数を逆の配列に設定するだけになります。@dwickern の回答は、コードを修正するための正しいアイデアを提供します。

于 2015-04-06T03:09:43.643 に答える