JavaScript MapとSet、WeakMapとWeakSet

10799 ワード

Mapリソース構造

  • Mapは、ES 6における値のマッピングのための新しいデータ構造
  • である
  • オブジェクトは従来、文字列値をマッピングするために使用され、キーを値+検索値+削除キー+検索キーに格納されたコンテンツ+キーが文字列+サイズ
  • を手動で追跡することを可能にする.
    Mapのキーにはすべての値があります.サイズを簡単に取得し、挿入順に繰り返します.

    いつ使いますか。


  • 鍵が実行前に不明であり、すべての鍵が同じタイプであり、すべての値が同じタイプである場合、 マッピングの代替の使用

  • 個々の要素ごとに論理を適用する必要がある場合はobjectsを使用します.
  • WeakMap


    WeakMapは鍵で、オブジェクトタイプのみ使用できます.Symbolなどの元の値はWeakMapの鍵として使用できません.
    ビルトインWeakMapには、キーオブジェクトの弱参照のみが含まれます.そのため,内蔵WeakMapはゴミ収集を防止せず,ゴミ収集鍵参照も消滅する.マッピングの値も「弱」参照であり、ゴミ収集はブロックされません.WeakMapは、鍵がゴミ収集されていない場合にのみ、価値のある情報を鍵に関連付ける非常に有用な構造です.
  • 弱参照のため、WeakMapの鍵はリストできません.(鍵リストをインポートする方法は存在しません.)
  • という方法が存在する場合、実施はゴミ収集状態に依存し、非決定的な結果
  • を生成する.
  • キーのリストが必要な場合は、Map
  • を使用します.

    Set資料構造


  • オブジェクトは値の集合です.格納された要素は、入力された順序で繰り返し処理できます.Setでは重複する値は許可されません.したがって、特定の値はセット内に1つしか存在しません.

  • 従来のアレイと比較したメリット

  • indexOf法を使用して、アレイ内に特定の要素が存在するか否かを決定するのは遅い.

  • アレイでは、これらの要素をアレイから切り取る必要があります. Setオブジェクトは、要素の値として要素を削除する機能を提供します.(has、delete、add)(複数のタイプを追加できます)

  • 配列にはindexOf法としてNaNが見つからない.

  • Setオブジェクトは値の一意性を保証するため、要素の重複性を直接チェックする必要はありません.
  • WeakSet


    オブジェクトは、オブジェクトを格納するコレクションです. WeakSetに重複するオブジェクトはなく、WeakSetの要素はリストできません.
    Setとの最大の違いは,WeakSetがSetと異なり,WeakSetはオブジェクトの集合であり,オブジェクトのみを格納できることである.特定のタイプの値は保存できません.
    WeakSetには弱い参照があります.WeakSetのオブジェクトへの参照は弱い接続です.WeakSetに格納されたオブジェクトへの参照がない場合は、ゴミ収集の対象となります.
    したがって、現在格納されているオブジェクトにはリストがなく、WeakSetは列挙オブジェクトではありません.

    Set、Mapのデータ構造を巡回するには、次の手順に従います。


    1.forEachメソッドによる巡回


    Map, Setで forEach([MapまたはSet].prototype.forEach) Array forEach(Array.prototype.forEach)に似ています 違います.
    ArrayのforEachが受信したコールバック関数の引数は順番に 値、 索引、 整列 順序よく入るでも. Map, Setで forEach受信コールバック関数の引数は順番に 値、 キー、 「オブジェクト」(MapまたはSet)に入ります.
    Setのコールバック関数はkeyではなくvalue 2です.value 2はvalueと同じです.次の例と「単一の値で巡回」 説明 確認してください.
        // JavaScript
        const map = new Map();
        const set = new Set();
        // TypeScript
        const map = new Map<string, string>();
        const set = new Set<string>();
        
        map.set('name', 'Mommoo');
        map.set('age' , 'secret');
        
        set.add('Mommoo');
        set.add('secret');
        map.forEach((value, key, mapObject) => console.log(key +' , ' +value));
        // name , Mommoo
        // age , secret
        set.forEach((value1, value2, setObject) => console.log(value1 +' , '+ value2));
        // Mommoo , Mommoo
        // secret , secret

    2. for.. 使用する文法を巡回する


    forEach 方法はツアー期間中です. continue, break, return 同じループ機能は使用できませんが、新しいES 6(ES 2015) for.. of 文法を使用する場合は、可能です.Map for.. 呼び出しの値は 身長と ベイリュー 整列 .しゅうごう for.. 呼び出しの値は ベリューです.
        const map = new Map();
        const set = new Set();
        map.set('name', 'Mommoo');
        map.set('age' , 'secret');
        set.add('Mommoo');
        set.add('secret');
        
        for ( let item of map ) {
        	console.log(item[0] +' , '+ item[1]);
        }
        // name , Mommoo
        // age , secret
        for ( let item of set ) {
        	console.log(item);
        }
        // Mommoo
        // secret
    TypeScriptはちょっと苦手です.理由はIterable属性type iterable属性for...の非コンパイル.