JavaScript简述-Set和Map

Set和Map

讲到Set和Map首先想到数组和对象的优缺点。

数组的优点
  1. 有顺序。

  2. 紧密性。

  3. 有关联。

数组的缺点
  1. 速度慢:增删改查。
  2. 有重复。
  3. 判断值时,必须遍历数组。
对象优点
  • 有键值对,增删改查快
  • 键唯一
  • 多重集合
对象的缺点
  • 没有关联
  • 按照添加顺序遍历
  • 如果需要查询属性时,需要遍历

Set

列表,增删该查快,无重复,只要值的列表,不能有键。

没有索引,不能使用for循环,也不能用下标直接修改或者获取。

Set的静态方法
  • add
  • delete
  • has 返回Boolean
  • clear 清除
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 中对对象的引用不会被考虑进垃圾回收机制,即只要没有其他的对象引用该对象,则该对象就会被回收,而不管它在不在 WeakSet
  • WeakSet 适合临时存放一组对象和跟对象绑定的信息
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值