7、Set集合与Map集合
第七章、Set集合与Map集合
1、检查对象的属性是否存在:
in操作符:不需要读取对象的值就可以判断属性是否存在对象中,存在返回true,否在返回false。
备注:in操作符会检索对象的原型,只能在对象原型为null时使用。
2、Set集合:有序唯一
1、创建Set集合并添加元素
let set = new Set();
set.add(5);
set.add('5');
console.log(set.size); //2
备注:数字5和字符串5在Set中是作为两个独立的元素存在的,即Set集合不会强制转换元素为字符串类型,内部使用的是Object.is()方法检测。
特例:Set集合中的+0和-0被认为是相等的。
Set被用于数组去重:
let set = new Set([1,3,2,4,5,5,5,5,5]);
consol.log(set.size); //5
备注:Set集合可以接受所有可迭代对象作为参数,例如数组、Set集合、Map集合等。
Set集合通过has()方法检测Set集合中是否存在某个值:、
let set = new Set();
set.add(5);
set.add('5');
console.log(set.has(5)); //true
console.log(set.has(6)); //false
2、移除元素
delete():移除Set集合中的某个元素
clear():清空Set集合
3、Set集合的forEach()方法
类似于数组:
情况1:
let set = new Set([1,2]);
set.forEach(function(v,k,self){
console.log(v+''+k);
console.log(self === set);
});
情况2:
let set = new Set([1,2]);
let processor = {
output(v){
console.log(v);
},
process(dataSet){
dataSet.forEach(function(v){
this.output(v)
},this);
}
};
processor.process(set);
优化情况2:
let set = new Set([1,2]);
let processor = {
output(v){
console.log(v);
},
process(dataSet){
dataSet.forEach(v => this.output(v));
}
};
processor.process(set);
备注:Set集合的数字键是从1开始的;不能像数组一样直接通过索引访问集合中的元素。
4、Set集合与数组的互转
let set = new Set([1,2,3,4,5,5,5,5,5]);
let array = [...set];
console.log(array); //[1,2,3,4,5]
数组的去重方法:
function eliminateDuplicates(arrs){
return [...new Set(arrs)];
}
5、WeakSet集合
由于Set集合是强引用集合,原因就是存储对象的时候,Set集合中存储的是对象的引用,当这个引用对应地址的值真的被清除后,集合中的引用
没有自动消失,而是继续存在,这样就出现了赫赫有名的内存泄漏事件。面对这个情况,使用弱引用WeakSet集合解决。
备注:WeakSet集合只存储对象的弱引用,并且不可以存储原始值;集合中的弱引用如果是对象唯一的引用,则会被回收并且释放相应的内存。
创建WeakSet集合:
let wset = new WeakSet();
let key = {};
wset.add(key);
console.log(wset.has(key)); //true
wset.selete(key);
console.log(wset.has(key)); //false
let key1 = {};
let key2 = {};
let wset = new WeakSet([key1,key2]);
console.log(wset.has(key1)); //true
console.log(wset.has(key2)); //true
备注:WeakSet构造函数不接受任何原始值!
两种set类型的主要区别:
1、WeakSet集合保存的是对象的弱引用。
2、WeakSet的实例中,给add()方法传入非对象参数会导致程序报错,给has()方法和delete()方法传入非对象参数会返回false。
3、WeakSet集合不可迭代,因此不能用于for-of循环。
4、WeakSet集合不暴露任何迭代器(keys()和values()方法)。
5、WeakSet集合不支持foeEach()方法。
6、WeakSet集合不支持size属性。
3、Map集合:有序
键和对应的值支持所有的数据类型。键名不会被强制转换为其他形式。
1、Map集合支持的方法
has(key):检测指定的键名在Map集合中是否存在
delete(key):从Map中删除指定键名及其对应的值
clear():移除Map集合中的所有键值对
size属性:返回当前集合中键值对的数量
2、Map集合的初始化方法
向Map构造函数传入数组来初始化一个Map集合。
数组中的每个元素都是一个子数组,子数组包含一个键值对的键和值两个元素。
let map = new Map([['name','lisi'],['age',14]]);
console.log(map.has('name')); //true
console.log(map.get('name')); //'lisi'
console.log(map.size); //2
3、Map集合的forEach()方法
类似Set集合和数组的forEach()方法
4、WeakMap集合:无序列表
弱引用Map集合,用于存储对象的弱引用。
WeakMap集合中的键名必须是一个对象,如果使用非对象键名会报错。
如果键名对应的值是一个对象,则保存的是对象的强引用,便不会触发垃圾回收机制。
1、使用WeakMap集合
WeakMap类型是一种存储着许多键值对的无序列表,列表的键名必须是非null类型的对象,键名对应的值可以是任意类型。
WeakMap集合不支持size属性。
WeakMap集合与WeakSet集合一样,都不支持键名枚举,也不支持clear()方法。
2、WeakMap集合的初始化方法
参考Map集合的初始化
3、WeakMap集合支持的方法
has():检测给定的键在集合中是否存在
delete():移除指定的键值对
4、私有对象数据
WeakMap集合量大用途:存储Dom元素、存储对象实例的私有数据
let Person = (function(){
let privateData = new WeakMap();
function Person(name){
privateData.set(this,{name});
}
Person.prototype.getName = function(){
return privateData.get(this).name;
}
return Person;
}());
5、WeakMap集合的使用方式及使用限制
考虑是否只用对象作为集合的键名 ==> WeakMap集合
考虑是否要使用forEach()、size、clear()方法 ==> Map集合
考虑是否使用非对象作为集合的键名 ==> Map集合
上一篇: 最大子序和(动态规划)
下一篇: 相交链表160