コアJavaScript第1章第1部


データ型のタイプ

  • 基本型:number、string、boolean、null、undefined、Symbol
  • 参照:オブジェクト、アレイ、関数、Date、RegExp
  • 不変性vs可変性


    デフォルト値は不変です(既存の値が存在するアドレスの値は変更できません).
    参照タイプには可変性があります(既存のアドレスの値を変更できます).
    ふへんせい

    メモリ

  • 変数領域:変数と定数を区別する可変ターゲット
  • データ領域:不変性の有無を区別する場合、変更可能なオブジェクト(不変性の基本タイプではデータ領域の値は変更されませんが、可変参照タイプではデータ領域の値を変更できます).
  • 基本例
    var a = 'abc';
    a = a + 'def';
    
    var b = 5;
    var c = 5;
    b = 7;
  • a,b,cは、いずれも変数領域にデータ領域のアドレスを有する.
  • aは、変数aによって格納される新しい文字列を生成する.
  • bおよびcは、同じアドレスを有する同じ値を指し、bの値が変化すると、データ領域にその値を有するデータ領域があるか否かに応じて、新しいデータ領域を作成し、値を生成して接続する.
  • =>
    メモリには1つの変数領域と1つのデータ領域があり、同じ値であれば異なる変数で作成されたアドレスのデータがリサイクルされ、置き換える場合はその値が存在するデータ領域が検索され、ない場合は新しいデータ領域が作成され、アドレス値が保存されます.

    変数領域とデータ領域を区別する理由


    ex)各変数に5の500個の変数を割り当てる場合、各空間に5を割り当てる場合、合計8バイト4000バイトが必要であり、入力されたアドレスが2バイト未満の場合、2~500+8の1008バイトしか必要ありません.
    重複データの処理効率が向上しました.

    可変値(既存の値が存在するアドレスの値を変更できます)


    ex)
    var obj1 = {
      a : 1,
      b : 'bbb'
    };
    
    obj1.a = 2;
    
    データ領域のa参照のアドレス値が1から2に変更されたことがわかります.(可変)

    ごみ収集器(GC)


    参照カウント0のメモリアドレスは、ゴミ収集器の収集対象となります.
    ex)既存の配列が文字列になった場合

    変更オブジェクトのproperty(相互影響)

    var obj1 = { c:10, d:'ddd'};
    var obj2 = obj1;
    
    b = 15;
    obj2.c = 20;

    オブジェクト自体を変更する場合(相互に分割)

    var obj1 = { c:10, d:'ddd'};
    var obj2 = obj1;
    
    b = 15;
    obj2 = {c : 20, d : 'ddd' };
    パラメトリックデータが가변값の場合、Propertyを変更するときに可変を適用

    可変の影響

    var user = {
      name : 'msk',
      gender : 'female'
    };
    
    var changeName = function (user,newName){
      var newUser = user;
      newUser.name = newName;
      return newUser;
    };
    
    var user2 = changeName(user, 'kim');
    
    console.log(user.name,user2.name)
    console.log(user === user2);
    既存のユーザーのproperty値も変化します.
    解決策
    var user = {
      name : 'msk',
      gender : 'female'
    };
    
    var changeName = function (user,newName){
      return {
        name : newName,
        gender : user.gender
      };
    };
    
    var user2 = changeName(user, 'kim');
    
    console.log(user.name,user2.name)
    console.log(user === user2);
    設定を変更して新しいオブジェクトを返します.
    共通に含まれるプロパティを変更するのではなく、いくつかの値を取得して新しいオブジェクトを作成します.
    1つ目の例は来店(user)でお金を受け取って勝手に両替(property変更)2つ目の例は来店してお金を受け取る時だけお金を受け取るので、今は気にしないで、バイバイの感じがしますか?

    さらに変更


    ハードコーディングの削減(オブジェクトのプロパティ数にかかわらず)
    既存のコンテンツのコピー後に必要なローカル値のみ変更
    var copyObject = function (target){
      var result = {};
      for( var prop in target){
        result[prop] = target[prop];
      }
      return result;
    };
    
    var user = {
      name : 'msk',
      gender : 'female'
    };
    
    var user2 = copyObject(user);
    user2.name = 'Kim';
    
    console.log(user.name, user2.name);
    console.log(user === user2);

    ソース


    コアJavaScript