es6 Map,Set 和 WeakMap,WeakSet


這些是新加的集合類型,提供了更加方便的獲取屬性值的方法,不用像以前一樣用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

es6features

 

本文作者starof,因知識本身在變化,作者也在不斷學習成長,文章內容也不定時更新,為避免誤導讀者,方便追根溯源,請諸位轉載注明出處:http://www.cnblogs.com/starof/p/6955802.html有問題歡迎與我討論,共同進步。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM