Set(集合)
集合内部,键名与键值是一致的,且永远不会重复
集合内部,元素可以是任意值,对象,数组,null,undefined,false,0 等等
let setEx = new Set(); //Set(0) {}
let setEx2 = new Set ([1,3,5,7,'1']); // Set(5) {1, 3, 5, 7, "1"}
// Set 具有以下方法:has add clear delete keys values ...
可以利用内部元素永远不会重复这一特性,使用数组去重
var set = new Set([1,2,3,4,3,2,1]); // [1,2,3,4]
set遍历可以这么遍历
for(let key of set.keys()) {
console.log(key);
}
// "aa"
// "bb"
// "cc"
WeakSet(弱集合)
集合内部,键名与键值一致,只能都是对象,可以重复
集合内部,元素只能是对象,null也不可以
var weakset = new WeakSet([{name:1},{name:1},{name:2}]);
// {{name:1},{name:1},{name:2}}
元素都是弱引用,可以被垃圾回收机制回收,可以用来保存DOM节点,不容易造成内存泄漏
WeakSet没有size,没办法遍历
Map(字典)
键名可以是任意类型的值(键名不可重复,重复会被后一个覆盖)。Object结构提供了 “字符串-值” 的对应,Map结构提供了 “值-值” 的对应。
let age = new Map([['emily',20],['snow',30],['jonse',18]]);
// {'emily' => 20, 'snow' => 30, 'jonse' => 18}
// Map方法 clear entries delete forEach ...
age.get('snow'); //30
age.has('snow'); //true
age.set('bob',37); //{"emily" => 20, "snow" => 30, "jonse" => 18, "bob" => 37}
age.delete('snow'); //true
age.has('snow'); //false
遍历字典,forEach就可以遍历
age.forEach(v=>{console.log(v)})
WeakMap(弱字典)
键名必须是对象,null也不行
let age2 = new WeakMap([[{name:1},20],[{name:1},30],[{name:2},18]]);
// {{name:1} => 20,{name:1} => 30,{name:2} => 18}
元素都是弱引用,可以被垃圾回收机制回收,可以用来保存DOM节点,不容易造成内存泄漏
不能遍历
weakMap的key可以用来保存dom节点,因为这个key(对象)的引用是弱引用,弱应用可以在任意时刻被回收~
什么时候会进行垃圾回收?
GC是周期性的进行的,定期查询无引用或者弱引用的对象,进行清除.....(新老生代/主副垃圾回收器那一堆...)
var metadata = new WeakMap();
var node1 = document.querySelector("#node1");
var node2 = document.querySelector("#node2");
metadata.set(node1, {
id: 'node1'
})
metadata.set(node2, {
id: 'node2'
})
console.log(metadata)
iterable
遍历Array可以采用下标循环,遍历Map和Set就无法使用下标。为了统一集合类型,ES6标准引入了新的iterable类型,Array、Map和Set都属于iterable类型。
具有iterable类型的集合可以通过新的for … of循环来遍历,其是ES6引入的新的语法。
与for …in的区别:
for…in在遍历过程中如果对原数组进行改变(比如push了一个元素),他还会按照以前的长度遍历;但是for…in就会多遍历一次