ES6入門之set和map

Set

ES6提供了新的數據結構Set。它類似於數組,但是成員的值都是唯一的,沒有重複的值。
Set函數可以接受一個數組(或類似數組的對象)作爲參數,用來初始化。

// 例一
var set = new Set([1, 2, 3, 4, 4]);
[...set]
// [1, 2, 3, 4]

var s = new Set();

[2, 3, 5, 4, 5, 2, 2].map(x => s.add(x));

for (let i of s) {
  console.log(i);
}
// 2 3 5 4

在Set內部,兩個NaN是相等。兩個對象總是不相等的。可以用length來檢測

四個操作方法:

  • add(value):添加某個值,返回Set結構本身。
  • delete(value):刪除某個值,返回一個布爾值,表示刪除是否成功。
  • has(value):返回一個布爾值,表示該值是否爲Set的成員。
  • clear():清除所有成員,沒有返回值

set內部的元素可以遍歷for…of…

weakset

WeakSet結構與Set類似,也是不重複的值的集合。

WeakSet和Set的區別:

  • WeakSet的成員只能是對象,而不能是其他類型的值
  • WeakSet中的對象都是弱引用,即垃圾回收機制不考慮WeakSet對該對象的引用,也就是說,如果其他對象都不再引用該對象,那麼垃圾回收機制會自動回收該對象所佔用的內存,不考慮該對象還存在於WeakSet之中。這個特點意味着,無法引用WeakSet的成員,因此WeakSet是不可遍歷的。

Map

Map結構提供了“值—值”的對應,是一種更完善的Hash結構實現。如果你需要“鍵值對”的數據結構,Map比Object更合適。它類似於對象,也是鍵值對的集合,但是“鍵”的範圍不限於字符串,各種類型的值(包括對象)都可以當作鍵。

var m = new Map();
var o = {p: "Hello World"};

m.set(o, "content")
m.get(o) // "content"

m.has(o) // true
m.delete(o) // true
m.has(o) // false

注意,只有對同一個對象的引用,Map結構纔將其視爲同一個鍵。這一點要非常小心。

var map = new Map();

map.set(['a'], 555);
map.get(['a']) // undefined

上面代碼的set和get方法,表面是針對同一個鍵,但實際上這是兩個值,內存地址是不一樣的,因此get方法無法讀取該鍵,返回undefined。

如果Map的鍵是一個簡單類型的值(數字、字符串、布爾值),則只要兩個值嚴格相等,Map將其視爲一個鍵,包括0和-0。另外,雖然NaN不嚴格相等於自身,但Map將其視爲同一個鍵。

實例屬性和方法:size、set、get、has、delete、clear

遍歷方法:keys()、values()、entries()、forEach()

WeakMap可以參考WeakSet

發佈了18 篇原創文章 · 獲贊 7 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章