ES6 提供了新的數據結構 Set。它相似於數組,可是成員的值都是惟一的,沒有重複的值。算法
由於 Set 中的值老是惟一的,因此須要判斷兩個值是否相等。在ECMAScript規範的早期版本中,這不是基於和===操做符中使用的算法相同的算法。具體來講,對於 Set s, +0 (+0 嚴格相等於-0)和-0是不一樣的值。然而,在 ECMAScript 2015規範中這點已被更改。有關詳細信息,請參閱瀏覽器兼容性 表中的「value equality for -0 and 0」。
另外,NaN和undefined均可以被存儲在Set 中, NaN之間被視爲相同的值(儘管 NaN !== NaN)。
Set自己是一個構造函數,用來生成 Set 數據結構。數組
Set函數能夠接受一個數組(或者具備 iterable 接口的其餘數據結構)做爲參數,用來初始化。瀏覽器
let b = new Set(['a','b','c','a','b']); // Set(3) {"a", "b", "c"}
set傳入參數也能夠一試string;數據結構
let a = new Set('aabbcc'); // Set(3) {a,b,c}
Set 結構的實例有如下屬性。函數
Set 實例的方法分爲兩大類:操做方法(用於操做數據)和遍歷方法(用於遍歷成員)。下面先介紹四個操做方法。prototype
Array.from方法能夠將 Set 結構轉爲數組。或者是擴展運算符...
code
const items = new Set([1, 2, 3, 4, 5]); const array = Array.from(items); const test = [...items];
Set 結構的實例有四個遍歷方法,能夠用於遍歷成員。對象
因爲 Set 結構沒有鍵名,只有鍵值(或者說鍵名和鍵值是同一個值),因此keys方法和values方法的行爲徹底一致。接口
let set = new Set(['red', 'green', 'blue']); for (let item of set.keys()) { console.log(item); } // red // green // blue for (let item of set.values()) { console.log(item); } // red // green // blue for (let item of set.entries()) { console.log(item); } // ["red", "red"] // ["green", "green"] // ["blue", "blue"]
Set 結構的實例默承認遍歷,它的默認遍歷器生成函數就是它的values方法。ip
Set.prototype[Symbol.iterator] === Set.prototype.values
// true
這意味着,能夠省略values方法,直接用for...of循環遍歷 Set。
let set = new Set(['red', 'green', 'blue']); for (let x of set) { console.log(x); } // red // green // blue
WeakSet 結構與 Set 相似,也是不重複的值的集合。可是,它與 Set 有兩個區別。
首先,WeakSet 的成員只能是對象,而不能是其餘類型的值。
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 中的對象都是弱引用,即垃圾回收機制不考慮 WeakSet 對該對象的引用,也就是說,若是其餘對象都再也不引用該對象,那麼垃圾回收機制會自動回收該對象所佔用的內存,不考慮該對象還存在於 WeakSet 之中。
JavaScript 的對象(Object),本質上是鍵值對的集合(Hash 結構),可是傳統上只能用字符串看成鍵。這給它的使用帶來了很大的限制。
爲了解決這個問題,ES6 提供了 Map 數據結構。它相似於對象,也是鍵值對的集合,可是「鍵」的範圍不限於字符串,各類類型的值(包括對象)均可以看成鍵。也就是說,Object 結構提供了「字符串—值」的對應,Map 結構提供了「值—值」的對應,是一種更完善的 Hash 結構實現。若是你須要「鍵值對」的數據結構,Map 比 Object 更合適。
const map = new Map([ ['name', '張三'], ['title', 'Author'] ]); map.size // 2 map.has('name') // true map.get('name') // "張三"
不單單是數組,任何具備 Iterator 接口、且每一個成員都是一個雙元素的數組的數據結構(詳見《Iterator》一章)均可以看成Map構造函數的參數。這就是說,Set和Map均可以用來生成新的 Map。
遍歷方法
Map 結構原生提供三個遍歷器生成函數和一個遍歷方法。
WeakMap與Map的區別有兩點。
首先,WeakMap只接受對象做爲鍵名(null除外),不接受其餘類型的值做爲鍵名。