這些是新加的集合類型,提供了更加方便的獲取屬性值的方法,不用像以前一樣用hasOwnProperty來檢查某個屬性是屬於原型鏈上的呢還是當前對象的。同時,在進行屬性值添加與獲取時有專門的get,set 方法。
// Sets var s = new Set(); s.add("hello").add("goodbye").add("hello"); s.size === 2; s.has("hello") === true; // Maps var m = new Map(); m.set("hello", 42); m.set(s, 34); m.get(s) == 34; // Weak Maps var wm = new WeakMap(); wm.set(s, { extra: 42 }); wm.size === undefined // Weak Sets var ws = new WeakSet(); ws.add({ data: 42 }); // Because the added object has no other references, it will not be held in the set
一、Map
Map解決的是Object的鍵值對中鍵只能是字符串的問題。
Map是Es6提供的新的數據結構,是鍵值對的集合。Map的“鍵”不限於字符串。各種類型的值(包括對象)都可以當做鍵。
Map的遍歷
let map=new Map([['F','no'],['T','yes']]); for(let key of map.keys()){ console.log(key); } //F //T map.keys(); //MapIterator {"F", "T"} map.values() //MapIterator {"no", "true"} for(let value of map.values()){ console.log(value); } //no //yes for(let [key,value] of map.entries()){ console.log(key,value); } //F no //T yes
Map轉數組
var m=new Map([ [1,"one"], [2,"two"], [3,"three"] ]) m.keys() //MapIterator {1, 2, 3} [...m.keys()] //[1, 2, 3] m.values() //MapIterator {"one", "two", "three"} [...m.values()] //["one", "two", "three"] m.entries() //MapIterator {[1, "one"], [2, "two"], [3, "three"]} [...m.entries()] //[Array[2], Array[2], Array[2]] [...m] //[Array[2], Array[2], Array[2]]
二、WeakMap
WeakMap結構與Map結構基本類似,唯一的區別就是WeakMap只接受對象作為鍵名(null除外),而且鍵名所指向的對象不計入垃圾回收機制。
WeakMap專用場景:
它的鍵所對應的對象可能會在將來消失。
典型應用:
一個對應DOM元素的WeakMap結構,當某個DOM元素被清除,其所對應的WeakMap記錄就會自動被移除。
有時候我們會把對象作為一個對象的鍵用來存放屬性值,普通集合類型比如簡單對象會阻止垃圾回收器對這些作為屬性鍵存在的對象的回收,有造成內存泄漏的危險。而WeakMap,WeakSet則更加安全些,這些作為屬性鍵的對象如果沒有別的變量在引用它們,則會被回收釋放掉。
參考:
http://www.cnblogs.com/chris-oil/p/5715248.html
本文作者starof,因知識本身在變化,作者也在不斷學習成長,文章內容也不定時更新,為避免誤導讀者,方便追根溯源,請諸位轉載注明出處:http://www.cnblogs.com/starof/p/6955802.html有問題歡迎與我討論,共同進步。