ES6新增的Set、WeakSet 、Map、WeakMap数据结构
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);
还没有评论,来说两句吧...