JavaScript简述-Set和Map

JavaScript简述-Set和Map,第1张

Set和Map

讲到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 对象允许你将弱引用对象储存在一个集合中

WeakSet 与 Set 的区别:

WeakSet 只能储存对象引用,不能存放值,而 Set 对象都可以即WeakSet 中对对象的引用不会被考虑进垃圾回收机制,即只要没有其他的对象引用该对象,则该对象就会被回收,而不管它在不在 WeakSetWeakSet 适合临时存放一组对象和跟对象绑定的信息

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1297135.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存