[図書]ノードjs設計モード-Chapter 01-2


Node.js設計モードを読み、まとめます.

Chapter 01) Node.jsプラットフォームについて


概要

  • Node.jsの哲学「Node way」
  • Node.jsバージョン6およびES 2015
  • Reactorモード-Node.js非同期アーキテクチャのキーメカニズム
  • 1.2 Node.js 6とES 2015

  • 全書のサンプルコードは、ES 2015(=ES 6)、Nodeに基づいている.js 6以降のバージョンに基づく
  • の説明
  • 厳格モード:厳格モード、変数初期化、繰り返し宣言などのコード問題の厳格なチェックによって、モードを通知します.
  • 2"use strict"句を追加し、使いやすい
  • 関数、モジュール、ファイルユニットなどに適用
  • 1.2.1 let,constキーワード

  • let:宣言ブロックスキャン変数
  • // var 사용 예
    if (false) {
      var x = "hello";
    }
    console.log(x); // undefined
    //------------------------------------
    // let 사용 예
    if (false) {
      let x = "hello";
    }
    console.log(x); // ReferenceError: x is not defined
  • const:定数変数宣言
  • オブジェクトで属性を変更すると、参照属性の値が変更されるため、
  • というエラーは発生しません.
  • (すなわち、Not Errorの例)はX -> {}, {}.name -> "John"であり、オブジェクトは
  • に変更されていない.
  • モジュールを使用する場合、最良の例は
  • であり、変数の予期しない再割り当てを回避する.
    // Error
    const x = 'This will never change';
    x = '...'; // TypeError: Assignment to constant variable
    //------------------------------------
    // Not Error
    const x = {}
    x.name = 'John';

    1.2.2矢印関数

  • 関数定義の簡潔な構文.フォーマットは
  • で、他の言語のramフォーマットと同じです.
  • パラメータが1で、関数の本体が1行のコード(),{}であれば、戻りは省略できます
  • を省略することはできない.
    const numbers = [2, 6, 7, 8, 1];
    // 생략 가능 예
    const even = numbers.filter(x => x%2 === 0);
    // 생략 불가능 예
    const even = numbers.filter(x => {
      if (x%2 === 0) {
        console.log(x + ' is even!');
        return true;
      }
    });
  • 矢印関数として定義された関数は、親ブロックの値に等しい語彙範囲(語彙範囲)にバインドされます.
  • 従来の方法で関数を宣言すると、呼び出し時の状況に応じてこの値が変更されるため、個別のスキーマとして使用されます.
    語彙範囲は他の書籍ではLexicalEnvironmentと呼ばれています.矢印関数を使用して関数を呼び出す場合、この値は親ブロックの値にバインドされず、それ自体が親ブロックの値にバインドされるため、スキャンチェーンを使用して親ブロックのthisを参照します.
  • 1.2.3類文法

  • 使いやすい構文機能
  • は実際にはプロトタイプによって継承された
  • である.
    class Person {
      constructor (name, surname, age) {
        this.name = name;
        this.surname = surname;
        this.age = age;
      }
      
      getFullname () {
        return this.name + ' ' + this.surname;
      }
      
      static older (person1, person2) {
        return (person1.age >= person2.age) ? person1 : person2;
      }
    }
  • クラス構文の重要な特徴はextendとスーパーキーワード拡張プロトコルタイプ
  • を使用することである.
  • カバー率
  • をサポート
    class PersonWithMiddlename extends Person {
      constructor (name, middlename, surname, age) {
        super(name, surname, age);
        this.middlename = middlename;
      }
      
      getFullName() {
        return this.name + '' + this.middlename + '' + this.surname;
      }
    }
    クラス構文で作成されたインスタンスは、実際に作成されたインスタンスとは異なります.
    クラスインスタンスはクラスオブジェクトとして表され、prototypeプロパティと__proto__プロパティはnullとして表されます.
    また、プライベートフィールドは#field形式(ES 2020より提供)に設定することができる

    1.2.4強化されたオブジェクトシリーズ

  • 変数と関数をオブジェクトのメンバーとして指定し、オブジェクトの作成時に動的メンバー名
  • を定義できます.
  • setterおよびgetter関数
    const namespace = '-webkit-';
    const style = {
      [namespace + 'box-sizing'] : 'border-box',
      [namespace + 'box-shadow'] : '10px10px5px #888888'
    };
    
    const person = {
      name: 'George',
      surname: 'Boole',
      
      get fullname () {
        return this.name + '' + this.surname;
      }
      
      set fullname (fullname) {
        let parts = fullname.split('');
        this.name = parts[0];
        this.surname = parts[1];
      }
    };
    
    console.log(person.fullname); // George Boole
    console.log(person.fullname = 'Alan Turing');
    console.log(person.name); // Alan

    1.2.5 MapとSet Collection

  • Map:ES 2015は、安全で柔軟で直感的なHashMapセットの新しいプロトコルを提供します.
  • set、get、has、deleteなどの方法は
  • をサポートする.
  • ループ内のすべてのエントリは、第1の要素をキーとし、第2の要素を値とする配列
  • である.
  • 関数は、通常のオブジェクト({})のキーが文字列に変換されるため、
  • とはならないMapのキーとしても使用できます.
  • ループを実行するときに挿入順序を確認します.通常のオブジェクト({})
  • は常に保証されません.
  • は、テストフレームワーク
  • を構築するために使用することができる.
  • セット:すべての要素に一意の値を持つリストを作成します.
  • add、has、delete、sizeなどの方法は
  • をサポートする.
  • セットのデータは重複することができず、直接データを取り出すことができない
  • .
  • ループのすべてのエントリには、値
  • があります.
  • 要素、オブジェクトおよび関数
  • を含むことができる
    // Map
    const profiles = new Map();
    profiles.set('twitter', '@adalovelace');
    profiles.set('facebook', 'adalovelace');
    profiles.set('googleplus', 'ada');
    
    profiles.size; // 3
    profiles.has('twitter'); // true
    profiles.get('twitter'); // "@adalovelace"
    profiles.has('youtube'); // false
    profiles.delete('facebook');
    profiles.has('facebook'); // false
    profiles.get('facebook'); // undefined
    for (const entry of profiles) {
      console.log(entry);
    }
    
    // Set
    const s = new Set([0, 1, 2, 3]);
    s.add(3);
    s.size; // 4
    s.delete(0);
    s.has(0); //false
    
    for (const entry of s) {
      console.log(entry);
    }

    1.2.6 WeakMapとWeakSet Collection

  • Map,Set Prototypeの「弱」バージョン
  • MapとSetの違い
  • WeakMap:ループを介して要素全体を参照することはできません.オブジェクトのみをキーとする
  • WeakSet:オブジェクトのみが要素
  • の最大の違いは、要素であるキーまたは要素のオブジェクトが他の場所で参照されていないことであり、WeakMapおよびWeakSetのみで仮想集合
  • を行うことができることである.
  • オブジェクトに関するメタデータを格納するのに非常に有用である
  • .
    // WeakMap
    let obj = {};
    const map = new WeakMap();
    map.set(obj, {key: "some_value"});
    console.log(map.get(obj)); // {key: "som_value"}
    obj = undefined; // 다음 가비지 컬렉트 사이클에서 맴에 관련된 객체와 데이터가 정리됨
    
    // WeakSet
    let obj1 = {key: "val1"};
    let obj2 = {key: "val2"};
    const set = new WeakSet([obj1, obj2]);
    console.log(set.has(obj1)); // true
    obj1 = undefined; // obj1이 set에서 제거됨
    console.log(set.has(obj1)); // false

    1.2.7テンプレート表記法

  • 文字列は、代替として
  • を提供する.
  • 逆引用符(`)を区切り記号
  • として使用
  • は、変数または式
  • を文字列に${expression}の形式で挿入することができる.
    const name = "Leonardo";
    const interests = ["arts", "architecture", "science", "music", "mathematics"];
    const birth = { year: 1452, place: "Florence" };
    const text = `${name} was an Italian polymath interested in many topics such as ${interests.join(', ')}. He was born in ${birth.year} in ${birth.place}`
    console.log(text);

    1.2.8 ES 2015のその他の機能

  • 基本パラメータ
  • 残りパラメータ
  • 展開演算子
  • 非構造化(設計)
  • new.target(「第2章.Node.js必須モード」に含む)
  • Proxy(「6章デザインモード」で提供)
  • Relect
  • Symbols