ES6中新增了內置引用類型:Set、WeakSet 、Map、WeakMap ,他們都是數據結構,數據結構是指相互之間存在特定關係的數據元素的集合。
其中Set和Map提供了iterator接口,可以遍歷。
Set數據結構
Set是一種類似數組的數據結構,是不重複的集合。
通過new Set()可以聲明一個Set對象實例,new Set()接受一個數組(或類數組的對象)作爲參數,用來初始化。
let arr=[1,2,3,3]; //(4) [1, 2, 3, 3]
let set=new Set(arr);
console.log(arr); //[1, 2, 3, 3]
console.log(set); //Set(3) {1, 2, 3}
console.log(set.size); //3 size屬性返回Set實例的成員總數
set.add(4); //add() 用於向Set中添加元素
set.delete(1); //delete() 用於從Set中刪除元素
console.log(set.has(1)); //false has() 用於判斷某元素是否存在
console.log(set); //Set(3) {2, 3, 4}
set.add({a:1}); //Set 添加任意類型的元素
set.add({a:1}); //兩個相同的對象不相等,不會去重,set中NaN只能有一個
console.log(set); //Set(5) {2, 3, 4, {…}, {…}}
console.log([...set]) //轉爲數組(5) [2, 3, 4, {…}, {…}]
set.clear(); //clear() 用於清除所有元素
console.log(set); //Set(0) {}
Set 結構的遍歷:
Set的原型中有keys方法、vaules方法、entries方法,返回的都是Set遍歷器對象(SetIterator),可以通過for of遍歷。
由於Set 結構的鍵名和鍵值是同一個值),所以keys方法和vaules方法的行爲完全一致。entries方法返回的成員是以一組鍵值對的結構。
let set=new Set(['a','b','c']);
console.log(set.keys()); // SetIterator {"a", "b", "c"} keys()獲取Set的所有key
console.log(set.values()); // SetIterator {"a", "b", "c"} values()獲取Set的所有value
console.log(set.entries()); // SetIterator {"a" => "a", "b" => "b", "c" => "c"} entries()獲取Set所有成員
for(let key of set.keys()){
console.log(key);
}
for(let value of set.values()){
console.log(value);
}
for(let [key,value] of set.entries()){
console.log(key+':'+value);
}
也可以用forEach進行遍歷
let set=new Set(['a','b','c']);
set.forEach(function(value,key){
console.log(value,key)
});
WeakSet數據結構
WeakSet數據結構與Set類似,也是不重複的集合,字面意思是弱Set,Set中添加任意類型的元素,但Set中對象的引用都是強類型化的,並不會允許垃圾回收,ES6還引入了WeakSet的弱集合,WeakSet只能存儲對象作爲成員,允許從內存中清除不再需要的被這些集合所引用的對象。
- WeakSet的成員只能是對象
- WeakSet中的對象都是弱引用
如果一個對象是WeakSet集合的成員,而其他對象都不再引用該對象,那麼該對象將會被垃圾回收機制回收 - WeakSet集合不可遍歷
let s=new Set();
let ws=new WeakSet();
s.add([1,2,3]);
ws.add([1,2,3]);
console.log(s); //Set(1) {Array(3)}
console.log(ws); //WeakSet {Array(3)}
//10秒後ws中的成員被回收
setTimeout(function () {
console.log(s); //Set(1) {Array(3)}
console.log(ws); //WeakSet {}
},10000);
WeakSet的三個方法add(),delete(),has()參考Set實例對象的方法。
Map數據結構
如果說Set類似數組,那麼Map比較類似對象,Map集合中的成員是以一組鍵值對的結構, 這和Object對象一樣,但Object對象的鍵名要求是字符串或Symbol,而Map成員的鍵名可以是任何類型的值。
- 初始化Map需要一個二維數組,或者直接初始化一個空Map
- set( )方法給實例設置一對鍵值對。
- 對一個key重複賦值時,會進行覆蓋
//創建實例並初始化,參數是一個數組,數組的成員是鍵值對形式的數組
var m1=new Map([
['id', 1],
[2, 2],
[{}, 3]
]);
console.log(m1);
var m2 = new Map();
m2.set('id', 1);
m2.set(2, 2);
m2.set({}, 3);
console.log(m2);
Map 結構的遍歷:
同Set一樣,Map的原型中有keys方法、vaules方法、entries方法,返回的都是Map遍歷器對象(SetIterator),可以通過for of遍歷。keys()獲取Map實例的鍵名,values()獲取Map實例的鍵值,entries()獲取Map實例的鍵值對。
let m=new Map();
m.set("id",1);
m.set("name",'Lily');
m.set("age",18);
console.log(m); //
console.log(m.keys()); // MapIterator {"id", "name", "age"} keys()獲取Map實例的所有key
console.log(m.values()); // MapIterator {1, "Lily", 18} values()獲取Map實例的所有value
console.log(m.entries()); // MapIterator {"id" => 1, "name" => "Lily", "age" => 18} entries()獲取Map實例的鍵值對
for(let key of m.keys()){
console.log(key);
}
for(let value of m.values()){
console.log(value);
}
for(let [key,value] of m.entries()){
console.log(key+':'+value);
}
也可以用forEach進行遍歷
m.forEach(function(value,key){
console.log(key+':'+value);
});
WeakMap結構
- WeakMap結構同Map類似,但Map結構中鍵名可以是任何類型的值,而WeakMap結構中的鍵名必須是引用類型。
- WeakMap結構與WeakSet結構相似,WeakMap集合不可遍歷
- WeakMap是弱集合,允許被垃圾回收機制回收
- WeakMap的4個方法set(),add(),delete(),has()
let wm=new WeakMap();
wm.set({},1);
console.log(wm); //WeakMap {{…} => 1}
//10秒後ws中的成員被回收
setTimeout(function () {
console.log(wm); //WeakMap {}
},10000);