プリミティブ値と非プリミティブ値を理解する


JavaScript のプリミティブ値は、プロパティやメソッドを持たない値です. Javascript には、プリミティブ値の 5 つのデータ型があります.
  • 文字列
  • 番号
  • ブール値
  • ヌル
  • 未定義

  • 一方、非プリミティブ値は、プロパティまたはメソッドを持つ値です. Javascript には、非プリミティブ値の 2 つのデータ型があります.
  • オブジェクト
  • 配列

  • プリミティブ値と非プリミティブ値の違いは、プリミティブ値は不変であるのに対し、非プリミティブ値は変更可能であることです.もう 1 つの違いは、値によるプリミティブ値のコピー、参照による非プリミティブ値のコピーです.

    値によるコピー



    値によるコピーとは何かを理解するために、例を見てみましょう.

    let a = 17
    


    この例では、変数 a の値を 17 に設定しますが、実際に舞台裏で行われるのは、javascript が javascript メモリに予約済みスペースを作成し、その予約済みスペースに値 17 を格納することです.例を簡単にするために、予約済みスペースが呼び出されたとします. 001.

    let a = 17
    // memory 001 = 17
    


    次に、別の変数を設定します.何が起こるか見てみましょう.

    let a = 17
    // memory 001 = 17
    let b = a
    


    実際に起こるのは、javascript が a メモリに格納されている 001 変数内の値をコピーして変数 b に割り当て、次に javascript が変数 b 用にメモリ内の別のスペースを予約したことです.

    let a = 17
    // memory 001 = 17
    let b = a
    // memory 002 = 17
    


    変数 002 の値を変更するとどうなるでしょうか.

    a = 15;
    console.log(a);
    // 15
    console.log(b);
    // 17
    


    変数 a を変更すると、変数 a の値も変更されるべきではないのでしょうか?

    javascript は b メモリ内に保存されている値を 15 に変更しますが、予約済みスペース 001 メモリに変更がないため、変数 b の値は 17 のままです.これは値によるコピーと呼ばれます.

    a = 15;
    console.log(a);
    // 15
    // memory 001 = 15
    console.log(b);
    // 17
    // memory 002 = 17
    


    参照によるコピー



    以下の例を見て、参照によるコピーとは何かを理解しましょう.

    var car = {
        name: 'Ford',
        type:'Fiesta',
        horsePower: 100
    };
    


    この例では、変数 car の値をオブジェクトで設定します.値によるコピーと同様に、javascript はメモリ内に領域を予約し、予約領域内にオブジェクトの値を格納します.簡単にするために、予約領域が 002 と呼ばれるとしましょう.

    var car = {
        name: 'Ford',
        type:'Fiesta',
        horsePower: 100
    };
    // memory 003 = {name: 'Ford', type: 'Fiesta', horsePower: 100}
    


    別の変数を設定しましょう.

    var car = {
        name: 'Ford',
        type:'Fiesta',
        horsePower: 100
    };
    
    var anotherCar = car;
    


    次に、car オブジェクト内のキー 003 の値を変更します.何が起こるか見てみましょう.

    car.type = 'Focus';
    
    console.log(car.type);
    // Focus
    console.log(anotherCar.type);
    // Focus
    
    


    これをメモリ参照で理解しましょう.変数 type を作成するときに、javascript メモリにもスペースを予約しました.簡単にするために anotherCar と呼びましょう.ただし、メモリ 004 内に保存されている値は、変数 004 の予約スペースのアドレスではなく、単純な car メモリ内の car オブジェクト値からコピーされません. 004 を格納します.

    var car = {
        name: 'Ford',
        type:'Fiesta',
        horsePower: 100
    };
    // memory 003 = {name: 'Ford', type: 'Fiesta', horsePower: 100}
    
    var anotherCar = car;
    // memory 004 = 003
    


    これにより、car オブジェクト内のキー 003 の値を変更すると、変数 type 内のキー type の値も変更される理由が説明されます. anotherCar 変数は、anotherCar 変数が指しているのと同じメモリアドレスを指しているためです.