1. 程式人生 > >es6 Map,Set 和 WeakMap,WeakSet

es6 Map,Set 和 WeakMap,WeakSet

mage span 移除 種類 安全 時有 簡單 weak 方便

這些是新加的集合類型,提供了更加方便的獲取屬性值的方法,不用像以前一樣用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有問題歡迎與我討論,共同進步。

es6 Map,Set 和 WeakMap,WeakSet