このコードが同じこと (1,2,3,4) を 2 回警告するのはなぜですか??
var arr = [1,2,3];
var new_arr = arr;
new_arr[new_arr.length] = 4;
alert(new_arr);
alert(arr);
このコードが同じこと (1,2,3,4) を 2 回警告するのはなぜですか??
var arr = [1,2,3];
var new_arr = arr;
new_arr[new_arr.length] = 4;
alert(new_arr);
alert(arr);
JavaScript では、すべての値はプリミティブ値 (数値、文字列、ブール値、、null
)undefined
またはオブジェクトへの参照 (配列、関数など) のいずれかです。
配列は 1 つだけで、両方の変数がこの配列への参照を保持します。
個別に変更できるように別の配列が必要な場合は、最初の配列を複製します。
var arr = [1,2,3];
var new_arr = arr.slice();
の配列JavaScript
はreference object
.
これを行う場合:
var arr = [1,2,3];
var new_arr = arr;
これで、同じデータ構造を指している 2 つの変数ができました。配列の割り当ては参照によるものです。つまり、データのコピーは作成されず、両方の変数が同じ配列を指すだけです。
したがって、どちらの変数を変更しても、両方が指す同じデータを変更することになります。
だから、あなたがするとき:
new_arr[new_arr.length] = 4;
データの 1 つのコピーが変更され、両方の変数が同じ変更を報告します。
JavaScript では、データのコピーが必要な場合は、コピーを明示的に作成する必要があり、また、浅いコピー (トップ レベルの項目のみがコピーされる) と深いコピー (オブジェクトまたは配列にネストされた配列もコピーされます)。
.slice()
メソッドの配列の浅いコピーは非常に簡単です。
var arr = [1,2,3];
// make a copy of the array
var new_arr = arr.slice(0);
// modify the copy
new_arr[new_arr.length] = 4;
alert(arr); // shows length of 3
alert(new_arr); // shows length of 4
2 番目の変数を変更すると、基になる配列が操作されます。これは、両方の変数によって参照されますが (物事を表す)、1 つのことであり、2 回表示されます。
これは、参照型と値型に関係しています。