「javascript現代プログラミング」学習ノート——対象Objectとsmbol


基礎
リストの最後の属性はコンマで終わるべきです.
let user = {
  name: "John",
  age: 30,
}
これはフォロー(triling)またはコンマをかけることといいます.このように属性を追加、削除、移動するのに便利です.すべての行は似ています.
多単語を属性名として、[]でアクセスします.
let user = {
  name: "John",
  age: 30,
  "likes birds": true  //           
};
“likes birds”は、1つの複数の単語を対象とする属性名である.彼の価値を得るためには、正常なuser.nameのように取得することができません.[]が必要です.
alert(user["likes birds"])//true
先に定義してから使用できます.
let key = "likes birds";
delete user[key];
しかし、通常のuser.nameのような点記号は上記のように定義されてはいけない.
let key = "name";
alert( user.key ) // undefined
属性の略記
function makeUser(name, age) {
  return {
    name, //   name: name   
    age   //   age: age   
    // ...
  };
}
存在性チェック
  • ===undefined
  • key in Object
  • let obj = {
      test: undefined
    };
    
    alert( obj.test ); //    undefined,       ?
    
    alert( "test" in obj ); // true,    !
    
    for…in
    let user = {
      name: "John",
      age: 30,
      isAdmin: true
    };
    
    for (let key in user) {
      // keys
      alert( key );  // name, age, isAdmin
      //      
      alert( user[key] ); // John, 30, true
    }
    
    属性の並べ替え
  • 整数属性(ここでいう4つの変更なしに証明書に変換される文字列)は、数字順に並べられた
  • である.
    let codes = {
      "49": "Germany",
      "41": "Switzerland",
      "44": "Great Britain",
      // ..,
      "1": "USA"
    };
    
    for(let code in codes) {
      alert(code); // 1, 41, 44, 49
    }
    
    もしお客様が整数に従いたくないなら、私達は非整数属性の名来の騙しプログラムを使って、各キーの前に“+”号を追加します.
            let codes = {
                "+49": "Germany",
                "+41": "Switzerland",
                "+44": "Great Britain",
                // ..,
                "+1": "USA"
            };
    
            for (let code in codes) {
                console.log(+code); // 1, 41, 44, 49
                console.log(typeof +code);//number
            }
    
  • は整数属性ではなく、作成時の順序で
  • を並べ替える.
    let user = {
      name: "John",
      surname: "Smith"
    };
    user.age = 25; //     
    
    //                  
    for (let prop in user) {
      alert( prop ); // name, surname, age
    }
    
    オブジェクトの参照
    参照コピー
    オブジェクトは他の基本タイプとは異なり、オブジェクトは参照によって格納され、コピーされます.基本タイプのコピー:
            let message = "Hello!";
            let phrase = message;
            console.log(message,phrase);//Hello! Hello!
            phrase = "world";
            console.log(message,phrase);//Hello! world
    
    オブジェクトは参照によってコピーされます.
            let user = {
                name : 'John',
            }
            let admin = user;
            console.log(admin,user);//{name: "John"} {name: "John"}
            admin.name = 'Peter';
            console.log(admin,user)//{name: "Peter"} {name: "Peter"}
    
    オブジェクトがコピーされると、参照はコピーされますが、オブジェクト自体はコピーされていません.つまり、対象は一つの引き出しに相当します.ueradminは二つの鍵で、adminで対象となる引き出しの内容を変えました.
    比較参照
    2つのオブジェクト参照相は、同時にuserおよび==を参照してtrueに戻ります.
    let a = {};
    let b = a; //     
    
    alert( a == b ); // true,           
    alert( a === b ); // true
    
    2つのオブジェクトが戻ってくるのは===です.
            let a = {};
            let b = {}; //        
    
            alert(a == b); // false
            alert(a === b); //false
    
    オブジェクトを定数falseによって修正されたオブジェクトは修正可能であり、ここでいう修正は修正値であり、参照ではない.
            const user = {
                name: 'aa'
            }
            user.name = 'bb';
            console.log(user.name);//bb
            user = {
                name: 'cc'
            }
            console.log(user.name);//Uncaught TypeError: Assignment to constant variable.
    
    Object.assignをコピーして合併します.
    オブジェクトをコピーしてクローンしたり、オブジェクトを統合したりします.constこの方法はsrc 1,…,srcCNのこれらすべてのオブジェクトをdestにコピーする.つまり、2番目のパラメータからすべてのオブジェクトの属性が最初のパラメータオブジェクトにコピーされ、destに戻ります.
            let user = { name: "John" };
            let permissions1 = { name: "Peter" };
            let permissions2 = { canEdit: true };
    
            Object.assign(user,permissions1,permissions2);
            console.log(user);//{name: "Peter", canEdit: true}
            permissions1.name = "Happy";
            console.log(permissions1.name)//Happy
            console.log(user.name);//Peter
    
  • 属性名が同じであれば、
  • が上書きされます.
  • を統合した後、複製されたオブジェクトを修正することは、行の変化であり、クローン後の結果に影響を与えない.
  • Object.assign(dest,[sec1,sec2])は、循環割当値の代わりに簡単なクローン動作を行う.
            let user = { name: "John" };
            let clone = Object.assign({},user);
            console.log(clone)//{name: "John"}
    
    深さクローン
    オブジェクトの属性が他のオブジェクトの参照である場合は、深さクローンが準備されます.例えば次のこのオブジェクト
            let user = {
                name: "John",
                sizes: {
                    height: 182,
                    width: 50
                }
            };
            let clone = Object.assign({},user);
            console.log(clone.sizes);//{height: 182, width: 50}
            console.log(clone.sizes == user.sizes)//true
            user.sizes.height ++;//183
            console.log(clone.sizes.height)//183
    
    上記のようにObject.assignオブジェクトを複製することができないのは、userのこの参照のみがコピーされているからである.この問題を解決するために、私達はコピーする時にuser[key]のそれぞれの値をチェックします.もしそれが対象であれば、それをもう一回コピーします.これをディープコピーといいます.JavaScriptによって実現されたライブラリlodashは、メソッド名を_といいます.clone Deep(obj)
        <script src="lodash.js"></script>
        <script>
            let user = {
                name: "John",
                sizes: {
                    height: 182,
                    width: 50
                }
            };
            let clone = _.cloneDeep(user);
            console.log(clone.sizes == user.sizes)//false
    
    オブジェクトのキー、値、アイテム
  • Object.keys(obj)は、オブジェクト全体のキーを含む配列を返します.
  • Object.values(obj)は、オブジェクトのすべての値を含む配列を返します.
  • Object.entries(obj)は、オブジェクトのすべてのキーペアを含む配列を返します.
  • sizesは、行列オブジェクトを返します.
  • は、キー属性としてObject.***を無視することができる
  • .
  • Symbolタイプのキーを取得するには、Symbolを使用してSymbolタイプのみを含む配列
  • を返すことができる.
  • は、Object.gatOwnPropertySymbol方式を使用して「すべて」キーを返すこともできる.
  •         let id = Symbol('id');
            let user = {
                name: "John",
                age: 30,
                [id]: '123'
            };
    
            let result = Object.keys(user);
    
            console.log(result);
            // ["name", "age"]
            // 0: "name"
            // 1: "age"
            // length: 2
            console.log(typeof result); //object      
    
            for (let values of Object.values(user)) {
                console.log(values);
            }
            console.log(Object.getOwnPropertySymbols(user)); //[Symbol(id)]
            console.log(Reflect.ownKeys(user));
            //  ["name", "age", Symbol(id)]
            // 0: "name"
            // 1: "age"
            // 2: Symbol(id)
            // length: 3
    
    Symbolタイプ
    「Symbol」値は一意の識別子を表す.
    基本的な使い方
  • 作成
  •         let id = Symbol('id');
    
    Reflect.ownKeys(obj)Symbol('id')は説明である.同じ値の記述も異なる.
            let id = Symbol('id');
            let id1 = Symbol('id');
            console.log(id == id1);//false
    
  • Symbolは自動的に文字列
  • に変換されません.
            alert(id)//Uncaught TypeError: Cannot convert a Symbol value to a string
            alert(id.toString())//Symbol(id)
            alert(id.description);//id
    
    idおよび.toString()を呼び出して説明のみを表示することができます.
    属性を隠す
            let user = { //        
                name: "John"
            };
    
            let id = Symbol("id");
    
            user[id] = 1;
    
            console.log(user[id]); // 1        Symbol         
            let id1 = Symbol("id");
    
            user[id1] = "Their id value";
            console.log(user)// {name: "John", Symbol(id): 1, Symbol(id): "Their id value"}
    
    文字列「id」にSymbol(「id」)を使うとどんなメリットがありますか?アメリカはもう一つのコードに属していますので、もう一つのコードもそれを使っていくつかの操作を実行します.だから私たちはその上に任意のフィールドを加えるべきではないです.これはとても危険です.ただし、Symbolは意外にアクセスされないので、第三者コードが見えないので、Symbolを使うのは問題ないかもしれません.
    対象文字数の中のSymbol
  • は、四角い括弧を使ってくくります.
  • は、点演算子を使用してはいけません.
  • let id = Symbol("id");
    
    let user = {
      name: "John",
      [id]: 123 //     "id:123"
    };
    alert(user[id])//123
    
    for…inスキップObject.keysも無視します.
    let id = Symbol("id");
    let user = {
      name: "John",
      age: 30,
      [id]: 123
    };
    
    for (let key in user) alert(key); // name, age (no symbols)
    
    //    Symbol       
    alert( "Direct: " + user[id] )
    
    Object.assignは文字列とsmbol属性を同時にコピーします.
    let id = Symbol("id");
    let user = {
      [id]: 123
    };
    
    let clone = Object.assign({}, user);
    
    alert( clone[id] ); // 123
    
    グローバルSymbol
    Symbol.for()
    グローバルSymbolレジストリがあります.レジストリからSymbolを読み取るには、symbol.descriptionを使用してください.呼び出しは、グローバルレジストリを確認し、Symbol.for(key)として説明されたkeyがあれば、Symbolに戻り、そうでなければ新しいSymbolを作成し、与えられたSymbol(Symbol(key))を介してレジストリに格納する.
    //          
    let id = Symbol.for("id"); //     Symbol    ,    
    
    //     (             )
    let idAgain = Symbol.for("id");
    
    //     Symbol
    alert( id === idAgain ); // true
    
    Symbol.keyFor()
    レジストリのキーで名前を返します.
    //    name    Symbol
    let sym = Symbol.for("name");
    let sym2 = Symbol.for("id");
    
    //    Symbol    name
    alert( Symbol.keyFor(sym) ); // name
    alert( Symbol.keyFor(sym2) ); // id
    
    したがって、非グローバルSymbolには適用されません.
    let globalSymbol = Symbol.for("name");
    let localSymbol = Symbol("name");
    
    alert( Symbol.keyFor(globalSymbol) ); // name,   Symbol
    alert( Symbol.keyFor(localSymbol) ); // undefined,   
    
    alert( localSymbol.description ); // name
    
    Symbolがグローバルでないと、それは見つけられなくなり、undefinedに戻ります.