讲到Set和Map首先想到数组和对象的优缺点。
数组的优点有顺序。
紧密性。
有关联。
数组的缺点 速度慢:增删改查。有重复。判断值时,必须遍历数组。 对象优点 有键值对,增删改查快键唯一多重集合 对象的缺点 没有关联按照添加顺序遍历如果需要查询属性时,需要遍历 Set列表,增删该查快,无重复,只要值的列表,不能有键。
没有索引,不能使用for循环,也不能用下标直接修改或者获取。 Set的静态方法 adddeletehas 返回Booleanclear 清除let arr = [1, 2, 3, 4, 5, 2, 3, 4, 5];
let SetArr = new Set(arr);
// 增add 删delete 查has
console.log(SetArr.add(5), SetArr.delete(4), SetArr.has(5));
// 清除 clear()
遍历键和值完全相同
SetArr.forEach((item, index, arr) => {
console.log(item, index, arr);
});
可遍历
for (let value of SetArr) {
console.log(value);
}
Set的应用
清除数组中的重复数据
let arr = [1, 2, 3, 4, 5, 2, 3, 4, 5];
arr = Array.from(new Set(arr));
Map
需要有键值对,需要有长度,可以遍历属性列表;可以遍历列表;增删改查速度快;和哈希表类似。
Map添加键值对let a = new Map();
a.set("name", "Boriska");
a.set("age", "20");
a.set("sex", "Man");//添加键值对
console.log(a.get("age"), a.has("age"));//只能用来查找键
a.delete("age"); //删除键值对
console.log(a.size);
a.clear(); //清空
普通的Map不能使用对象作为属性存储值
for (let arr of a) {
console.log(arr); //第0项目是键,第一项是值
}
for (let arr of a.keys()) {
console.log(arr);
}
for (let arr of a.values()) {
console.log(arr);
}
//普通的Map不能使用对象作为属性存储值
//普通的Map不能使用对象作为属性存储值
var obj = { a: 1 };
a.set(obj, 10); //键被变为强引用
obj = null; // 将obj置为null并不会使 { a: 1 } 被垃圾回收,因为还有map引用了 { a: 1 }
所以Map可能导致内存溢出,因为数组会一直保存每个键值引用,即便是引用早已离开作用域,垃圾回收器也无法回收这些内存。
什么叫强引用 弱引用 强引用//普通的Map不能使用对象作为属性存储值
var obj = { a: 1 };
a.set(obj, 10); //键被变为强引用
obj = null; // 将obj置为null并不会使 { a: 1 } 被垃圾回收,因为还有map引用了 { a: 1 }
弱引用
var obj = new WeakObject();
//我们什么都不用做,只用静静的等待垃圾回收机制执行,obj 所引用的对象就会被回收。
垃圾回收机制
有一个弱引用的概念: 一个对象若只被弱引用所引用,则被认为是不可访问(或弱可访问)的,并因此可能在任何时刻被回收。
为什么要有垃圾回收机制由于js对象没有固定大小,所有当他们的大小已知时,才能对他们进行动态的存储分配。只要像这样动态地分配了内存,最终都要释放这些内存以便他们能够被再用,否则,JavaScript的解释器将会消耗完系统中所有可用的内存,造成系统崩溃。
WeakMap Map和Weakmap的比较使用map,对象会占用内存,可能不会被垃圾回收。Map对一个对象是强引用
WeakMap 和 Map的第一个不同点就是,WeakMap 的键必须是对象,不能是原始值:
let weakMap = new WeakMap();
let obj = {};
weakMap.set(obj, "ok"); // 正常工作(以对象作为键)
// 不能使用字符串作为键
weakMap.set("a", "b"); // Error,因为 "a" 不是一个对象
Weakmap
则是完全不同的,它不会阻止关键对象的垃圾回收
使用map
,这个缓存器函数应该将obj对象保存在内存中。
但这将导致内存泄漏!
当我们对一个不再使用的对象保持引用的时候将会造成内存泄漏,所以如果你不再使用对象,请删除它的任何变量引用。
使用weakmap
时我们不应该使用.keys() / .values() /.entries()
,因为我们不知道何时垃圾回收器会移除这个对象。
WeakSet 对象允许你将弱引用对象储存在一个集合中
WeakSet 与 Set 的区别:
WeakSet 只能储存对象引用,不能存放值,而 Set 对象都可以即WeakSet 中对对象的引用不会被考虑进垃圾回收机制,即只要没有其他的对象引用该对象,则该对象就会被回收,而不管它在不在 WeakSetWeakSet 适合临时存放一组对象和跟对象绑定的信息欢迎分享,转载请注明来源:内存溢出
评论列表(0条)