ES6新增的Set、WeakSet 、Map、WeakMap數據結構

ES6中新增了內置引用類型:Set、WeakSet 、Map、WeakMap ,他們都是數據結構,數據結構是指相互之間存在特定關係的數據元素的集合
其中Set和Map提供了iterator接口,可以遍歷。

Set數據結構

Set是一種類似數組的數據結構,是不重複的集合。
通過new Set()可以聲明一個Set對象實例,new Set()接受一個數組(或類數組的對象)作爲參數,用來初始化。
在這裏插入圖片描述

let arr=[1,2,3,3];      //(4) [1, 2, 3, 3]
let set=new Set(arr);
console.log(arr);        //[1, 2, 3, 3]
console.log(set);        //Set(3) {1, 2, 3}
console.log(set.size);   //3 size屬性返回Set實例的成員總數
set.add(4);              //add() 用於向Set中添加元素
set.delete(1);           //delete() 用於從Set中刪除元素
console.log(set.has(1)); //false  has() 用於判斷某元素是否存在
console.log(set);        //Set(3) {2, 3, 4}
set.add({a:1});          //Set 添加任意類型的元素
set.add({a:1});          //兩個相同的對象不相等,不會去重,set中NaN只能有一個
console.log(set);        //Set(5) {2, 3, 4, {…}, {…}}
console.log([...set])    //轉爲數組(5) [2, 3, 4, {…}, {…}]
set.clear();             //clear() 用於清除所有元素
console.log(set);      //Set(0) {}

Set 結構的遍歷:

Set的原型中有keys方法、vaules方法、entries方法,返回的都是Set遍歷器對象(SetIterator),可以通過for of遍歷。
由於Set 結構的鍵名和鍵值是同一個值),所以keys方法和vaules方法的行爲完全一致。entries方法返回的成員是以一組鍵值對的結構。

  let set=new Set(['a','b','c']);
  console.log(set.keys());		// SetIterator {"a", "b", "c"}   keys()獲取Set的所有key
  console.log(set.values());	// SetIterator {"a", "b", "c"}  values()獲取Set的所有value
  console.log(set.entries());	// SetIterator {"a" => "a", "b" => "b", "c" => "c"}    entries()獲取Set所有成員
  for(let key of set.keys()){
    console.log(key);
  }
  for(let value of set.values()){
    console.log(value);
  }
  for(let [key,value] of set.entries()){
    console.log(key+':'+value);
  }

也可以用forEach進行遍歷

let set=new Set(['a','b','c']);
set.forEach(function(value,key){
    console.log(value,key)
});

WeakSet數據結構

WeakSet數據結構與Set類似,也是不重複的集合,字面意思是弱Set,Set中添加任意類型的元素,但Set中對象的引用都是強類型化的,並不會允許垃圾回收,ES6還引入了WeakSet的弱集合,WeakSet只能存儲對象作爲成員,允許從內存中清除不再需要的被這些集合所引用的對象。

  • WeakSet的成員只能是對象
  • WeakSet中的對象都是弱引用
    如果一個對象是WeakSet集合的成員,而其他對象都不再引用該對象,那麼該對象將會被垃圾回收機制回收
  • WeakSet集合不可遍歷
  let s=new Set();
  let ws=new WeakSet();
  
  s.add([1,2,3]);
  ws.add([1,2,3]);
  console.log(s);   //Set(1) {Array(3)}
  console.log(ws);  //WeakSet {Array(3)}
  //10秒後ws中的成員被回收
  setTimeout(function () {
    console.log(s);   //Set(1) {Array(3)}
    console.log(ws);  //WeakSet {}
  },10000);

在這裏插入圖片描述
WeakSet的三個方法add(),delete(),has()參考Set實例對象的方法。

Map數據結構

如果說Set類似數組,那麼Map比較類似對象,Map集合中的成員是以一組鍵值對的結構, 這和Object對象一樣,但Object對象的鍵名要求是字符串或Symbol,而Map成員的鍵名可以是任何類型的值。

  • 初始化Map需要一個二維數組,或者直接初始化一個空Map
  • set( )方法給實例設置一對鍵值對。
  • 對一個key重複賦值時,會進行覆蓋
//創建實例並初始化,參數是一個數組,數組的成員是鍵值對形式的數組
var m1=new Map([
	['id', 1], 
	[2, 2], 
	[{}, 3]
]);
console.log(m1);
var m2 = new Map();
m2.set('id', 1);
m2.set(2, 2);
m2.set({}, 3);
console.log(m2);

在這裏插入圖片描述

Map 結構的遍歷:

同Set一樣,Map的原型中有keys方法、vaules方法、entries方法,返回的都是Map遍歷器對象(SetIterator),可以通過for of遍歷。keys()獲取Map實例的鍵名,values()獲取Map實例的鍵值,entries()獲取Map實例的鍵值對。

  let m=new Map();
  m.set("id",1);
  m.set("name",'Lily');
  m.set("age",18);
  console.log(m); //
  console.log(m.keys());		// MapIterator  {"id", "name", "age"}   keys()獲取Map實例的所有key
  console.log(m.values());	// MapIterator {1, "Lily", 18}  values()獲取Map實例的所有value
  console.log(m.entries());	// MapIterator {"id" => 1, "name" => "Lily", "age" => 18}   entries()獲取Map實例的鍵值對
  for(let key of m.keys()){
    console.log(key);
  }
  for(let value of m.values()){
    console.log(value);
  }
  for(let [key,value] of m.entries()){
    console.log(key+':'+value);
  }
  

也可以用forEach進行遍歷

  m.forEach(function(value,key){
    console.log(key+':'+value);
  });

WeakMap結構

  • WeakMap結構同Map類似,但Map結構中鍵名可以是任何類型的值,而WeakMap結構中的鍵名必須是引用類型
  • WeakMap結構與WeakSet結構相似,WeakMap集合不可遍歷
  • WeakMap是弱集合,允許被垃圾回收機制回收
  • WeakMap的4個方法set(),add(),delete(),has()
    在這裏插入圖片描述
  let wm=new WeakMap();
  wm.set({},1);
  console.log(wm);  //WeakMap {{…} => 1}
  //10秒後ws中的成員被回收
  setTimeout(function () {
    console.log(wm);  //WeakMap {}
  },10000);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章