欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

7、Set集合与Map集合

程序员文章站 2024-03-23 09:41:04
...

第七章、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集合