210421.Today Iラーニング(TIL):不変性と操作性(+オリジナルとリファレンス)


Javascriptで参照データ型を処理する場合、想像以上に可変メソッドと可変メソッドを区別する必要があることがわかりますので、javascriptでのデータの可変性と不変性をまとめてみましょう.
その前に、元データ(元データ)と参考データ(参考データ)を整理しておきます.
1)元データ型(元データ)
  • オブジェクトではなく、メソッドを持たない6種類のタイプ->文字列、数字、bigint、boolean、null、undefined、シンボル
  • 各変数は、1つのデータ
  • のみを含む.
  • 変数を宣言すると、変数名とデータは「stack」という名前の記憶領域に格納されます.
  • 元データ型は、データのコピー時にデータをコピーするので、変更コピーは元データ(可変)
  • に影響しません.
    2)参照データ型(参照タイプデータ)
  • 配列、オブジェクト、関数など
  • 1変数は、複数のデータ
  • を含む.
  • は「heap」という空間にデータの内容を格納、「heap」のアドレスを「stack」の
  • に格納する.
  • データを呼び出す場合は、「スタック」に格納されているアドレスを参照して、「スタック」で
  • を検索して返してください.
  • 参照データは、データ自体ではなく、データをコピーする際にデータのアドレスをコピーするので、レプリカデータの変更は
  • に影響する(可変)
    1)浅いコピー(浅いコピー)
  • コピー元データのアドレス値
  • コピーデータは、元のデータと同じアドレス値
  • を参照する.
  • コピーデータを変更すると、元のデータが同時に変更されます(影響を受けます).
    --> mutable
  • 2)ディープコピー(deepcopy)

  • データ値自体のコピー

  • コピーデータ参照が元のデータのアドレス値と異なる(元のデータの参照から完全に切断された)

  • レプリカデータを変更しても元のデータには影響しません
    --> immutable
  • ▼▼変わらない方法
    .slice
    let a = [1,2,3];
    b = a.slice();
    b[1] = 0;
    console.log(b) = [1, 0, 3];
    console.log(a) = [1, 2, 3];
    ▼▼可変方法
    .pop
    a.pop();
    console.log(a) = [1, 2];
    .push
    let d = [4, 5, 6];
    d.push(7);
    console.log(d) = [4, 5, 6, 7];
    .shift
    let e = [7, 8, 9];
    e.shift();
    console.log(e) = [8, 9];
    .unshift
    let f = [10, 11, 12];
    f.unshift(9);
    console.log(f) = [9, 10, 11, 12];