jsシリーズ-セットとWeakSet弱引用


セットSetオブジェクトは値のセットであり、Set中の要素は一回しか現れない.つまりSet中の要素は唯一であり、基本タイプであれ、オブジェクト参照であれ.
    let set = new Set([1, 1, '1', { name: 'zhang' }, [1, 2, 3]]);
    console.log(set);//Set(4) {1, "1", {…}, Array(3)}
上記の簡単な定義を通して、いくつかの問題を発見できます. 
  • Setは「.」オブジェクトと定義されていますが、キー名
  • は値だけあります.
  • は、厳密なタイプの検出であり、文字列の数字が数値型の数字に等しくない、すなわち1と'1'は
  • を待たない.
  • と配列は異なるが、Setの値は唯一の
  • である.
    属性 
    size
     Setオブジェクト内の値の個数は、配列length属性のようなものです.
        let set = new Set([1, '1', { name: 'zhang' }, [1, 2, 3]]);
        console.log(set.size);//4
    方法
    addSetオブジェクトの末尾に要素を追加します.Setオブジェクトを返します.
        let set = new Set(['a','b']);
        console.log(set.add('c'));//Set(3) {"a", "b", "c"}
    delete
    単一の要素を削除し、戻り値はbooleanタイプです.
        let set = new Set(['a','b']);
        console.log(set.delete('b'));//true
        console.log(set.delete('c'));//false
    clearSetオブジェクト内のすべての要素を削除し、戻り値なし
        let set = new Set(['a','b']);
        console.log(set.clear());//undefined
    ハイ
    要素が存在するかどうかを確認します.戻り値はbollanタイプです.
        let set = new Set(['a','b']);
        console.log(set.has('b'));//true
        console.log(set.has('c'));//false
    巡回する
        let set = new Set(['a','b']);
        for (const item of set) {
            console.log(item);//'a'  'b'
        }
    
        for (const item of set.keys()) {
            console.log(item); // 'a' 'b'
        }
        for (const item of set.values()) {
            console.log(item); // 'a' 'b'
        }
        for (const item of set.entries()) {
            console.log(item); // ["a", "a"]  ["b", "b"]
        }
    行列変換
    配列チャプタについて説明しましたが、変換方法は2つあります. Array.formです. 静的方法は、セットを行列に変換することができ、配列のいくつかの便利な方法を使用することができる.
        let set = new Set(['a', 'b']);
        console.log(Array.from(set));//["a", "b"]
        console.log([...set]); //["a", "b"]
    配列に変換した後、配列のfilter方法でsetデータをフィルタリングします.
        //      ,   3   
        let set = new Set([1, 2, 3, 4, 5]);
        set = new Set([...set].filter(item => item < 3));
        console.log(set);//Set(2) {1, 2}
    
        //  set  ,     3   
        let set1 = new Set([1, 2, 3, 4, 5]);
        set1.forEach(item => {
          if (item >= 3) {
            set1.delete(item);
          }
        })
        //  
        // for (const item of set1) {
        //   if (item >= 3) {
        //     set1.delete(item);
        //   }
        // }
        console.log(set1);
    配列
    もう一つの用が多いのは、配列をSetに回して重複要素を取り除くことです.もちろんこれは受信した外部データに重複要素があるということです.私達自身が定義しているなら、直接Setタイプと定義できます.
        //        
        let arr = [1, 2, 3, 4, 5, 3, 1];
        arr = [...new Set(arr)];
        console.log(arr);//[1, 2, 3, 4, 5]
    配列内の集合/交叉/差集合/補完
        let arr1 = [1, 2, 3, 8, 9];
        let arr2 = [2, 8, 5, 6];
    
        //  (           )
        console.log(arr1.concat(arr2.filter(item => !arr1.includes(item))));//[1, 2, 3, 8, 9, 5, 6]
        //  (           ),       [2, 8]
        console.log(arr1.filter(item => arr2.includes(item)));// [2, 8]
        //  (  arr1  ,  arr2      )
        console.log(arr1.filter(item => !arr2.includes(item)));// [1, 3, 9]
        //  (  arr1 arr2             )
        console.log(arr1.filter(item => !arr2.includes(item)).concat(
          arr2.filter(item => !arr1.includes(item))
        ))//[1, 3, 9, 5, 6]
    Setの集合/交叉/差集合/補完
        let set1 = new Set([1, 2, 3, 9]);
        let set2 = new Set([2, 5]);
        console.log(set1, set2)
        //  
        console.log(new Set([...set1, ...set2]))//Set(5) {1, 2, 3, 9, 5}
        //  
        console.log(new Set([...set1].filter(item => set2.has(item))))//Set(1) {2}
        //  
        console.log(new Set([...set1].filter(item => !set2.has(item))))//Set(3) {1, 3, 9}
        //  
        console.log(new Set([...set1].filter(item => !set2.has(item)).concat(
          [...set2].filter(item => !set1.has(item))
        )))//Set(4) {1, 3, 9, 5}
    ウェストセット
    WeakSetとSetは同じで、重複しない値のセットですが、Setとは2つの違いがあります.
  • WeakSetのメンバーはオブジェクトだけです.
  • WeakSetの対象は弱引用
  • である.
    つまり、WeakSetにおけるオブジェクトへの参照は、ゴミ回収機構には考慮されない.つまり、他のオブジェクトがこのオブジェクトを参照していない限り、オブジェクトは回収され、WeakSetにいなくても、(この特性のため、WeakSetはオブジェクトと紐付けされた情報のセットを一時的に保存するのに適している)
    3.WeakSetはsize属性がないので、遍歴できません.WeakSetにはいくつかのメンバーがいます.ゴミ回収の仕組みは運行されていますか?運行前後にメンバーの個数は違っています.ゴミ回収の仕組みはいつ運行されるかは予測できないので、ES 6の規定によるWeakSetは遍歴されてはいけません.
    WeakSetの応用シーン/メリット
    DOMノードを記憶するために、これらのノードがドキュメントから取り外されるとメモリリークを引き起こす心配がなく、メモリリークを避けるために使用できます.
    WeakSetの文法
  • WeaSetは構成関数であり、new WeakSet()によって一例
  • を生成することができる.
    WeakSetは構成関数として機能します.受信可能な配列またはクラスの配列オブジェクトはそのパラメータとして扱います.配列の全メンバーは自動的にWeakSetオブジェクトのメンバーになります.
    注:(1)配列のメンバーは、オブジェクトのみ(WeakSetのメンバーはオブジェクトのみ)(2)WeakSetのメンバーとなるのは配列のメンバーであり、配列自体ではない.
    WeakSetには3つの方法があります.add、delete、has WeakSet.prototype.add(value)はWeakSetのインスタンスにメンバーWeakSet.prototype.delete(value)を追加し、WeakSetのインスタンスをクリアする指定メンバーWeakSet.prototype.has(value)は、WeakSetのインスタンスに値があるかどうかを判断し、ブール値に戻ります.