【解決方法】javascript で配列を変更すると、配列のコピーに影響します。なぜですか?


JavaScript の配列もオブジェクトであり、変数はオブジェクト自体ではなく、オブジェクトへの参照のみを保持します。 したがって、両方の変数が同じオブジェクトへの参照を持ちます。
しかし、なぜ?

私が試したこと:

JavaScript
var func= new function () {
         var A = [20, 30, 25, 5, 3, 2];
         var B = A;

         for (var i = 0; i <= A.length - 1; i++) {
             if (A[i] > A[i+1]) {
                 var tmp = A[i];
                 A[i] = A[i + 1];
                 A[i + 1] = tmp;
             }
         }

             var big = A[A.length-1];
             var index = 0;

             for (var j = 0; j <= B.length-1; j++) {
                 if (big == B[j])
                 {
                     index = j;
                     break;
                 }
             }
             console.log(A);
             console.log(B);
             return (index);
     };

解決策 1

シンプル: 同じ配列です。

JavaScript
var A = [20, 30, 25, 5, 3, 2];
var B = A;

作成します A 値の配列でそれを「ポイント」し、作成します B から「ポインタ」をコピーします ABであるため、どちらもメモリ内の同じ場所を参照しています。 したがって、 A 経由でアクセスすると、データも変更されます B

配列データのコピーを取得するには、 スライス[^] 関数:

JavaScript
var A = [20, 30, 25, 5, 3, 2];
var B = A.slice();

解決策 2

そのように言語が機能するからです。 別の方法は、 コピー 割り当てられた他のオブジェクト。たとえば、後

var B = A;

B (によって参照されるオブジェクト) のコピーを参照します。 A 2 つのオブジェクトは独立していたはずです (これが、たとえば、 structの振る舞い C/C++ プログラミング言語)。

このような代替手段は「高価」であり、オブジェクト(あなたの場合は配列)を明示的にコピーすることで常に同じ結果を得ることができることに注意してください。

解決策 3

スプレッド演算子を使用できます… B =[…A]. A値には影響しません

コメント

タイトルとURLをコピーしました