[javascript]モダンjavascriptDeepDive-11元の値とオブジェクトの比較

8666 ワード

元のタイプとオブジェクトのタイプは3つの面で大きく異なります.

  • 元のタイプの値、つまり元の値は変更できない値です.対照的に、オブジェクト(参照)タイプの値、すなわちオブジェクトは変更可能な値です.

  • 元の値を変数に割り当てると、変数(メモリ領域の確保)に実際の値が格納されます.対照的に、オブジェクトが変数に割り当てられている場合、変数(メモリ領域が確保されている)は参照値を格納します.

  • 元の値を持つ変数を他の変数に割り当てると、元の値がコピーされて渡されます.これを値転送(pass by value)と呼びます.これに対して、オブジェクトを指す変数を他の変数に割り当てると、ソースの参照値がコピーされて転送され、参照転送と呼ばれます.
  • 元の値


    元のタイプの値、つまり元の値は変更できない値です.変更不可は変数ではなく、値の記述です.
    つまり、「元の値は変更できません」ということです.つまり、元の値自体は変数値ではなく変更できません.変数は、いつでも再割り当てによって変数値を変更(厳密には置換)することができる.
    変数の相対概念定数とは、再割り当てを禁止する変数を指す.定数値を格納するメモリスペースが必要なため、変数といえる.ただし、変数はいつでも再割り当てで変数値を変更(置換)できますが、定数は1つしか指定できませんので、変数値を変更(置換)することはできません.したがって,定数と可変値は異なる.
    // const 키워드를 사용해 선언한 변수는 재할당이 금지된다. 
    const o = {};
    
    // const 키워드를 사용해 선언한 변수에 할당한 원시 값(상수)은 변경할 수 없다. // 하지만 const 키워드를 사용해 선언한 변수에 할당된 객체는 변경할 수 있다.
    o.a = 1;
    console.log(o); //{a: 1}
    元の値を割り当てた変数に新しい元の値を再割り当てすると、メモリ領域に格納された量の割り当て前の元の値を変更するのではなく、新しい元の値が割り当てられます.変数が参照するメモリ領域アドレスが変更されます.
    変数が参照するメモリ領域アドレスが変更されたのは、変数に割り当てられた元の値が変更できない値であるためです.元の値が変更可能な値である場合は、元の値自体を変更するだけで、変数が新しい元の値を再割り当てしたときに変数が指すメモリ領域のアドレスを変更する必要はありません.そうであれば、変数が参照するメモリ領域のアドレスは変更されません.
    ただし、元の値は変更できない値なので、直接値を変更することはできません.したがって、変数値を変更するために元の値を再割り当てすると、新しいメモリ領域が保持され、再割り当てされた値が保存され、変数が参照するメモリ領域のアドレスが変更されます.値のこの特性を不変性と呼ぶ.
    不変性を持つ元の値を割り当てる変数は、再割り当て以外に変数値を変更する方法はありません.

    文字列と不変性


    JavaScriptの文字列は元のタイプで変更できません.これは、文字列が作成された後に変更できないことを意味します.
    文字列は配列に似たオブジェクトであり、小さいため、配列のように各文字にアクセスできます.
    類似パターンオブジェクト
    類似配列オブジェクトとは、配列のようにインデックスを介してProperty値にアクセスでき、長さPropertyを持つオブジェクトです.文字列は、長さの単位を持つため、配列のようなオブジェクトであってもよいし、for文であってもよいため、配列のように各文字にインデックスでアクセスできます.
    var str = 'string';
    
    // 문자열은 유사 배열 객체이므로 배열과 유사하게 인덱스를 사용해 각 문자에 접근할 수 있다.
    console.log(str[0]); // s
    
    // 원시 값인 문자열이 객체처럼 등장한다.
    console.log(str.length); // 6
    console.log(str.toUpperCase()); // STRING
    突然、元の値である文字列がオブジェクトである可能性があり、混乱する可能性があります.まだ表示されていませんが、元の値をオブジェクトとして使用すると、元の値が元の値を囲むRapperオブジェクトに自動的に変換されます.これについては、21.3節で「元の値とRapperオブジェクト」で詳しく説明します.
    var str = 'string';
    
    // 문자열은 유사 배열이므로 배열과 유사하게 인덱스를 사용해 각 문자에 접근할 수 있다.
    // 하지만 문자열은 원시값이므로 변경할 수 없다. 이때 에러가 발생하지 않는다.
    str[0] = 'S';
    
    console.log(str); // string
    このようにして生成された文字列は読み取り専用値に変更できません.これにより、データの信頼性が保証されます.
    ただし、変数に新しい文字列を再割り当てすることは可能です.

    値による転送


    重要なのは、変数に元の値を持つ変数を割り当てる場合、変数の割り当てポイントでも2つの変数のいずれかに値を再割り当てしても、最終的には2つの変数の元の値が異なるメモリ領域に格納された別の値となり、どちらか一方が再割り当てによって値を変更しても相互に干渉することはできません.

    オブジェクト


    JavaScriptオブジェクトの管理方法
    JavaScriptオブジェクトは,Propertyキーをインデックスとして用いたハッシュテーブルであると考えられる.ほとんどのjavascriptエンジンでは、ハッシュ・テーブルに似ているのではなく、通常のハッシュ・テーブルよりも優れた方法でオブジェクトを実装し、より高いパフォーマンスを得ることができます.
    Java、C++などのクラスベースのオブジェクト向けプログラミング言語は、定義済みのクラスに基づいてオブジェクトを生成します.すなわち、オブジェクトを作成する前にpropertyメソッドが決定され、そのままオブジェクトが作成されます.オブジェクトを作成した後、Propertyを削除または追加することはできません.ただし、javascriptではクラスなしでオブジェクトを作成でき、オブジェクトの作成後にPropertyとメソッドを動的に追加できます.これは非常に使いやすいが,性能面ではクラスベースのオブジェクト向けプログラミング言語におけるオブジェクト生成やプログラムアクセスコストよりも理論的に高い低効率な方法である.
    したがって、V 8 JavaScriptエンジンは、動的ナビゲーションではなく「クラスを非表示」という方法でプロセスにアクセスし、C++オブジェクトにアクセスするプロセスに必要なパフォーマンスを確保します.クラスを隠す動作はjavaなどの固定オブジェクトクラスに似ています.

    可変値


    オブジェクトタイプの値、すなわちオブジェクトが変更可能な値です.
    元の値を割り当てられた変数に参照すると、メモリに格納されている元の値にアクセスします.ただし、オブジェクトに割り当てられた変数を参照し、メモリに格納された参照値から実際のオブジェクトにアクセスします.

    オブジェクトを変更するたびに元の値のように古い値をコピーして再生成すると、明確な信頼性が得られますが、オブジェクトが非常に大きく、サイズが元の値とは異なり、property値がオブジェクトである可能性があるため、コピー後に生成されるコストが高くなります.したがって、メモリをより効率的に使用し、オブジェクトをコピーすることで作成コストを削減し、パフォーマンスを向上させるために、オブジェクトは変更可能な値として設計されます.
    客体尼にはこれらの構造の欠点がもたらす副作用がある.元の値とは異なり、複数の識別子が1つのオブジェクトを共有できます.

    リファレンス転送

    var person = {
      name: 'Lee'
    };
    
    // 참조 값을 복사 (얕은 복사)
    var copy = person;
    オブジェクトを指す変数を別の変数に割り当てると、元のオブジェクトの参照値がコピーされて渡されます.これを参照の伝達と呼ぶ.
    Quiz
    s
    var person = {
      name: 'Lee'
    };
    
    var person2 = {
      name: 'Lee'
    };
    
    console.log(person1 === person2);
    consolle.log(persone1.name === person2.name);
    ===一致比較演算子は、変数に格納された値を変換せずに比較する.割り当てられたオブジェクトの変数には参照値があり、元の値を割り当てられた変数には元の値自体があります.したがって、比較演算子によって割り当てられたオブジェクトの変数を===で一致させると、参照値が比較され、比較割り当て元の値が元の値と比較されます.
    オブジェクトテキストは、評価のたびにオブジェクトを生成します.したがって、person1変数とperson2変数が指すオブジェクトは、内容は同じであるが、メモリに格納されている別のオブジェクトである.そのため、1回目はfalseでした.
    property値を参照するperson1.nameおよびperson2.nameは、値として評価できる式である.両方の式は、元の値「Lee」として評価されます.したがって、2番目の面はtrueです.