js es 6紹介set、WeakSet

3995 ワード

前言
es 6のセットとweaksetを紹介します.
本文
セット
ES 6は、新しいデータ構造Setを提供する.配列に似ていますが、メンバーの値は全部唯一で、重複した値はありません.
Set自体はSetデータ構造を生成するためのコンストラクターである.
{
  let list = new Set();
  list.add(5);
  list.add(7);
  console.log(list.size); //2
}
Set関数は、パラメータとして1つの配列を受け入れ、初期化することができます.
{
  let arr = [1,2,3,4,5];
  let list = new Set(arr);
  console.log(list.size);  //5
}
Setで繰り返される要素は追加されません.Setをリセットしてもデータの種類は変換されません.数字は数字です.文字列は文字列です.
{
 let arr=[1,2,3,1,'2']
  let list2=new Set(arr);
  console.log(list2);    //Set(4) {1, 2, 3, "2"}
}
Set内部では,二つのNaNは等しい.
let set = new Set();
let a = NaN;
let b = NaN;
set.add(a);
set.add(b);
set // Set {NaN}
二つのオブジェクトはいつも同じではない.
let set = new Set();
set.add({});
set.size // 1
set.add({});
set.size // 2
Setのインスタンスの属性と方法
Setの例の方法は、2つの大きなクラスに分けられている.操作方法(データを操作するための)とエルゴード方法(メンバを巡回するための)
四つの操作方法:add(value):ある値を追加して、Set構造自体に戻ります.delete(value):ある値を削除し、ブール値を返します.削除が成功したかどうかを表します.has(value):Setのメンバーであるかどうかを示すブール値を返します.clear():全メンバーをクリアし、戻り値がない.
{
  let arr=['add','delete','clear','has'];
  let list=new Set(arr);

  console.log(list.has('add')); //true
  console.log(list.delete('add'),list); 
//true Set(3){"delete", "clear", "has"}
  list.clear();     //  
  console.log(list);  // Set(0){}
}
{
  let arr=['add','delete','clear','has'];
  let list=new Set(arr);

  for(let key of list.keys()){
    console.log(key);  // add delete clear has 
  }
  for(let value of list.values()){
    console.log(value);   // add delete clear has  
  } 
  for(let [key,value] of list.entries()){
    console.log(key,value);
    // add add delete delete clear clear has has
  }

  list.forEach(function(item){console.log(item);})
  // add delete clear has 
}
Set構造の実例はデフォルトでは巡回可能で、デフォルトのエルゴード生成関数はそのvalues方法です.
{
  let arr=['add','delete','clear','has'];
  let list=new Set(arr);

  for(let key of list.keys()){
    console.log(key);  // add delete clear has 
  }
  for(let value of list.values()){
    console.log(value);   // add delete clear has  
  } 
  for(let [key,value] of list.entries()){
    console.log(key,value);
    // add add delete delete clear clear has has
  }

  list.forEach(function(item){console.log(item);})
  // add delete clear has 
}
これは、values方法を省略してfor...ofサイクルをSetを巡回することができるという意味です.
{
let set = new Set(['red', 'green', 'blue']);
for (let x of set) {
  console.log(x);
}
ウェストセット
WeakSetのメンバーは対象だけで、他のタイプの値ではありません.
{
  let weakList=new WeakSet();
  let arg={};
  weakList.add(arg);
  console.log(weakList); //{{}}

}

const ws = new WeakSet();
ws.add(1)
// TypeError: Invalid value used in weak set
ws.add(Symbol())
// TypeError: invalid value used in weak set

WeakSetはパラメータとして1つの配列または同様の配列のオブジェクトを受け入れることができる.
{const a = [[1, 2], [3, 4]];
const ws = new WeakSet(a);
console.log(ws)}
//WeakSet {Array(2), Array(2)}
//__proto__:WeakSet
//[[Entries]]:Array(2)
//0:Array(2)
//value:(2) [3, 4]
//1:Array(2)
//value:(2) [1, 2]
//length:2
なお、a配列のメンバーは、a配列自体ではなくWeakSetのメンバーとなる.これは、配列のメンバーはオブジェクトだけであることを意味する.
{
const b = [3, 4];
const ws = new WeakSet(b);
// Uncaught TypeError: Invalid value used in weak set(…)
}
WeakSet          。

add(value):     ,   WeakSet    。
delete(value):     ,       ,        。
has(value):       ,       WeakSet   。
const ws = new WeakSet();
const obj = {};
const foo = {};

ws.add(window);
ws.add(obj);

ws.has(window); // true
ws.has(foo);    // false

ws.delete(window);
ws.has(window);    // false
WeakSetはsize属性がないので、メンバーを遍歴することができません.
WeakSet   size  ,          。
ws.size // undefined
ws.forEach // undefined