TIL. データ型を勉強しましょう.


Core JavaScriptを読み、学習の部分を整理します.

📍データ型のタイプ

  • 基本型:数値、文字列、ブール値、null、undefined、シンボル
  • 参照:オブジェクト、配列、関数、日付、正規表現
    =>通常、기본형は、割り当てまたは演算時にコピーされ、참조형は参照される.
    🧐 どちらもコピーを行いますが、違いがあります.基本タイプでは、値を含むポップアップ値を直接コピーできますが、参照タイプでは、値を含むポップアップ値からなるセットのポップアップ値をコピーします.
  • 基本型は1回の湧出値をコピーするだけで,参照型はもう1段階を経る必要がある.
    基本型は불변성です.この不変性を理解するには、メモリとデータについて一定の理解が必要です.メモリとデータを見てみましょう.

    📍メモリとデータ


    パソコンはすべてのデータを0か1に変えて記憶します.0または1のみを表すメモリフラグメントは비트と呼ばれます.
    メモリは複数のビットで構成され、各ビットは고유한 식별자で位置決めできます.
    複数のビットを組み合わせると、検索時間を短縮し、表示可能なデータ数を増やすことができます.こうして바이트という単位が生まれた.1バイトは8ビットからなる.

    JAvascriptは、メモリ管理の圧力から相対的に解放されているため、64ビット、すなわち8バイトのより大きなメモリ領域が割り当てられています.
    ¥¥すべてのデータはバイト単位の識別子であり、より正確にはメモリオーバーフロー値で互いに区別し接続することができる.
    🧐JavaScriptのメモリ管理について説明しましょう.
    =>javascriptオブジェクトの作成時にメモリを自動的に割り当て、役に立たないときにメモリを自動的に解放します(ゴミ収集:自動メモリ管理方法)
    メモリの生存サイクルを見てみましょう.必要に応じて2を割り当てます.3を使います.いらないなら解除する

    📍識別子と変数

  • 変数:変更可能なデータ、変更可能なデータのスペースまたはコンテナ
    =>変数が値を格納する場所(値が存在するメモリのアドレス).
  • 識別子:データを識別するための名前:변수명
  • メモリに値を格納するには、まずメモリに保持すべきメモリのサイズを知る必要があります.これは、異なる値タイプ(データ型)が異なるメモリサイズを確保する必要があるためです.

    📍不変値

  • 変数領域メモリ:変数と定数を区別する可変ターゲット
  • データ領域メモリ:不変性を区別する場合の可変ターゲット
  • 📍 可変値


    基本データが不変の場合、参照データは可変値である必要があります.ただし、基本的な性質は通常可変値ですが、設定に従って変更することはできません.
    📍 基本データと参照データの最大の違い
    基本型コピー値、参照型コピーから値が出ます.ただし、どのデータ型でも、変数に割り当てるために浮動値をコピーする必要があります.
    厳密には、JavaScriptのすべてのデータ型は참조형 데이터にすぎません.ただし,基本型では湧出値のコピーは1回のみ行われ,参照型ではさらに1段階が経過する.
    ex) let a=1
    // a는 그냥 a 입력하면 접근이 가능하다.
    let b=[1,2,3]
    //b는 data에 접근하려면 index로 한번 더 들어가서 접근해야 값을 얻을 수 있다(2번이상 접근해야함)

    🙃不変オブジェクト


    参照型データの가변は、データそのものではなく内部プロパティを変更した場合にのみ作成されます.データ自体を変更したい場合(新しいデータを割り当てる場合)は、基本データと同様に既存のデータは変更されません.
    どのような場合にオブジェクトを変更する必要がありますか?値として渡されるオブジェクトを変更しても、元のオブジェクトは変更されない場合があります.この場合、不変のオブジェクトが必要です.
    🧐 JavaScriptからオブジェクトをコピーする方法

    浅い放射と深い放射


    浅いレプリケーションは、次のステップの値のみをコピーします.
  • オブジェクトを含む変数を別の変数に割り当てると、データコピーではなく参照が生成されます.したがって、1つの変数のデータを変更すると、他の変数のデータも変更されます.
  • (つまり、コピーを作成するのではなくコピーを作成するふりをする)
    const person1={name:'chloe'};
    const person2=person1;
    person1.name='jung';
    person2.name//jung
    person1===person2;
    すなわち、データを直接生成するのではなく、データのメモリアドレスをユーザに渡し、データを共有する.
    深度コピーは、内部のすべての値を検索してコピーする方法です.
  • の浅いコピーのように、データを共有するのではなく、同じ構造のオブジェクトを作成する場合は、深いコピーの概念が使用されます.
  • const person1={name:"chloe"};
    const person2=Object.assign({},person1);
    person1.name="jung";
    person2.name// chloe
    전혀 다른 메모리 주소의 데이터이므로 person2의 값은 변하지 않는다.
    person1!==person2 형태만 같고 각자 다른 메모리 주소에 저장되어 있는 데이터이다.
    データ参照ではなくオブジェクトの形状をコピーすることで、1つのオブジェクトが変更されても、他のオブジェクトのデータは影響を受けません.

    📍深度レプリケーションの一般的な方法


    Object.assign()
    オブジェクト形式のデータのマージを容易にする関数
    const originObj={a:1};
    const newObj=Object.assign({},originObj)
    // 빈 object에 originObj를 병합하여 반환
    newObj//{a:1}
    originObj ===newObj //false
    空のオブジェクトにコピーするオブジェクトをマージします.これにより、形式はoriginObjectですが、実際には空のオブジェクトとoriginObjectを結合した新しいオブジェクトが返されます.(同じ形状ですが、新しいオブジェクトを返します)
    展開演算子
    const obj1={a:1,b:2};
    const obj2={c:3};
    const obj3={...obj1,...obj2};
    
    obj3//{a:1,b:2,c:3}
    ...配置またはオブジェクト形式のカッコ展開で使用します.
    展開演算子の深度コピーを使用するには、次の方法を使用します.
    const obj1={a:1,b:2}
    const obj2={...obj1};
    obj2//{a:1,b:2}
    obj1===obj2//false
    でも!この深度コピーは現在のDepth以上では深度コピーされません.
    ふかほうしゃトラップ
    const obj1={a:{b:1}};
    const obj2={...obj1};
    obj2//{a:{b:1}}
    obj1 === obj2// false

    Depth가 2인 Object를 전개 연산자를 이용해 Obj2 변수에 할당했다.
    obj1과 obj2는 형태가 같지만 연산자를 이용해 확인해보면 각자 다른 메모리 주소에 저장된 데이터로 제대로 깊은 복사가 된 것처럼 보인다.

    그러나.. 깊은 복사가 된 것은 제일 바깥의 Depth뿐이다..

    const obj1={a:{b:1}};
    const obj2={...obj1};
    obj2//{a:{b:1}}
    obj1===obj2//false
    obj1.a===obj2.a//true????
    2番目のDepth以上の要素は、参照値を渡す浅いレプリケーション
    🧐完璧な深度レプリケーションを行うにはどうすればいいですか?
    1)深度コピーを再帰的に実行!
    -->ただし、深くコピーするシェイプに基づいて、再帰関数を作成してコピーします.面倒くさいこと.
    2)JSON.parse()とJSON.stringgify()関数の使用
    -->JSON.stringify関数を使用してオブジェクト全体を文字列に変換し、JSONを再開します.parse関数を使用して文字列をオブジェクトに変換します.
    👉 詳細については、「深い関数」、「浅い関数」セクション:https://helloinyong.tistory.com/267を参照してください.

    📍未定義とnull


    未定義:1)ユーザーが明示的に指定した場合
    =>これ自体が値です.Undefinedは空を意味するが、値として存在するため、propertyまたは配列内の要素には固有のキー値が存在する.(実績データ)
    2)値が存在しない場合、JavaScriptエンジンにより自動的に値が割り当てられます.
    =>この場合、構成または配列のキー値(インデックス)自体は存在しません.(値なし)
    null
    空を明示的に表す場合は、undefinedではなくnullを使用します.