元の値とオブジェクトの比較


元の値


不変値

  • を生成する元の値は、
  • に変更できません.
  • 変数再割り当て=>元の値Xを変更し、新しいメモリを解放すると割り当て値(メモリ領域アドレスを変更)
  • 文字列と不変性

  • JavaScriptの文字列は、元のタイプの値
  • です.
  • 文字列の一部の文字は
  • を変更できません.

    値による転送

  • 変数に元の値を持つ変数=>元の値
  • をコピーして渡す.
    var score = 80;
    // 원시 값 80이 복사되어 copy에 할당된다.
    var copy = score;
    
    console.log(score); // 80
    console.log(copy); // 80
    
    score = 100;
    
    console.log(score); // 100
    console.log(copy); // 80
    scoreとcopyの値は80ですが、異なるメモリ領域に格納されている別の値です.
    したがって、scoreの値を変更してもcopyには影響しません.
    実際、変数は値ではなくメモリアドレスを伝達するので、「値による伝達」は正しく表示されません.重要なのは、2つの変数の元の値が最終的に異なるメモリ領域に格納されるため、いずれの再割り当ても相互に干渉できないことです.

    オブジェクト


    可変値

  • 変数格納オブジェクト割当=>作成されたオブジェクトが存在するメモリ領域のアドレス(=参照値)
  • 変数は、参照値によってオブジェクト
  • にアクセスする.
  • を再割り当てすることなく、オブジェクトを直接変更(追加、更新、削除)
  • JavaScriptのオブジェクトは、クラスなしで作成できます.その後、Propertyとメソッドを動的に追加できます.したがって、元の値のように、確保する必要があるメモリ領域のサイズを予め決定することはできない.元の値で消費されるメモリは相対的に少ないが、オブジェクトが大きい可能性があります.
    これらの構造的な欠点を補うために、メモリの使用効率とパフォーマンスを向上させるために、オブジェクトは変更可能な値に設計されています.ただし、元の値とは異なり、複数の識別子が1つのオブジェクトの副作用を共有できるようになります.
    浅い放射と深い放射
  • 浅いレプリケーション:1つのステップのみ(ネストされたオブジェクトの参照値をレプリケーション)
  • 深度コピー
  • :オブジェクトにコピーされたすべてのネストされたオブジェクト(元の値などの完全なコピーを作成)
  • const o = { x: { y: 1 } };
    // 얕은 복사
    const c1 = { ...o };
    console.log(c1 === o); // false (복사로 생성된 객체는 원본과 다른 객체다.)
    console.log(c1.x === o.x); // true (참조값이 복사되어 같은 객체를 가리키므로)
    // lodash 의 cloneDeep 을 사용한 깊은 복사
    const _ = require('lodash');
    const c2 = _.cloneDeep(o);
    console.log(c2 === o); // false
    console.log(c2.x === o.x); // false (중첩 객체가 새로운 메모리 공간에 복사되므로)

    リファレンス転送

  • オブジェクトを指す変数を別の変数に割り当てる=>参照値がコピーされ、
  • が転送される.
    var person = {
      name: 'Lee'
    };
    
    // 참조 값 복사 (얕은 복사)
    var copy = person;
    personとcopyは同じ参照値を持つため、同じオブジェクトを指します.すなわち、2つの識別子は1つのオブジェクトを共有する.したがって、両方の一方がオブジェクトを変更すると、相互に影響します.