Set、Map、WeakSet、WeakMap详细介绍

Set是一种类似于数组的数据结构,它存储唯一值,不允许重复。可以使用add()、delete()和has()方法来操作集合中的元素。Set中的值是无序的,可以通过迭代器进行遍历。

优点

  • 快速查找元素是否存在。
  • 去重。

缺点

  • 不能直接通过索引访问元素。

使用场景

去重:可以使用Set来快速去除数组中的重复元素。

判断元素是否存在:可以使用Set来判断某个元素是否存在于集合中。

javascript 复制代码
// 去重
const arr = [1, 2, 3, 3, 4, 5, 5];
const uniqueSet = new Set(arr);
console.log([...uniqueSet]); // [1, 2, 3, 4, 5]
// 判断元素是否存在
const set = new Set([1, 2, 3]);
console.log(set.has(2)); // true
console.log(set.has(4)); // false

二、Map

Map是一种键值对存储数据的数据结构,类似于对象。每个键对应一个值。可以使用set()、get()、delete()和has()等方法来操作键值对。

优点

  • 可以使用任何类型作为键。
  • 提供了丰富的方法来操作键值对。

缺点

  • 相对于对象,Map的性能稍差。

使用场景

存储和查找数据:可以使用Map来存储和查找数据,键值对的形式更加直观和灵活。

javascript 复制代码
// 存储和查找数据
const map = new Map();
map.set('name', 'John');
map.set('age', 30);
console.log(map.get('name')); // John
// 遍历键值对
for (let [key, value] of map) {
 console.log(key + ' = ' + value);
}

三、WeakSet

WeakSet是一种特殊的Set,它只能存储对象,并且对象是弱引用关联的。WeakSet中存储的对象是弱引用关联的,即如果没有其他引用指向该对象,则该对象会被垃圾回收。WeakSet没有迭代器,不能遍历其中的元素。

优点

  • 不会造成内存泄漏:由于WeakSet中存储的对象是弱引用关联的,不会阻止被引用对象被垃圾回收。

缺点

  • 功能较弱:由于无法遍历和获取大小等限制,功能相对有限。

使用场景

存储临时数据:可以使用WeakSet来存储临时数据,不用担心内存泄漏的问题。

javascript 复制代码
// 存储临时数据
let obj1 = { name: 'John' };
let obj2 = { name: 'Jane' };
const weakSet = new WeakSet([obj1, obj2]);
// 注意:WeakSet没有迭代器,不能遍历其中的元素

四、WeakMap

WeakMap是一种特殊的Map,它只能使用对象作为键,并且键是弱引用关联的。WeakMap中使用的对象作为键是弱引用关联的,即如果没有其他引用指向该对象,则该对象会被垃圾回收。WeakMap没有迭代器,不能遍历其中的键值对。

优点

  • 不会造成内存泄漏:由于WeakMap中使用的对象作为键是弱引用关联的,不会阻止被引用对象被垃圾回收。

缺点

  • 功能较弱:由于无法遍历和获取大小等限制,功能相对有限。

使用场景

存储私有数据:可以使用WeakMap来存储私有数据,只有拥有对应的键才能访问到私有数据。

javascript 复制代码
// 存储私有数据
let privateData = new WeakMap()
class Person {
  constructor(name) {
    privateData.set(this, { name })
  }
  getName() {
    return privateData.get(this).name
  }
}
let person = new Person("John")
console.log(person.getName()) // John
// 注意:WeakMap没有迭代器,不能遍历其中的键值对

总结

通过以上代码示例,我们可以看到Set、Map、WeakSet和WeakMap的用法和特性。

在Set和Map中,如果一个对象被添加到集合中,即使在其他地方不再引用该对象,它仍然会被集合保留,不会被垃圾回收机制回收。这可能导致内存泄漏,特别是在长时间运行的应用程序中。

而在WeakSet和WeakMap中,存储的对象是弱引用关联的。这意味着如果一个对象只有在WeakSet或WeakMap中存在引用,并且没有其他地方引用它,那么该对象将被垃圾回收机制自动回收。这样可以有效地避免内存泄漏问题。

另外,由于弱引用关联的特性,WeakSet和WeakMap没有提供像Set和Map那样的迭代器方法来遍历元素。也没有size属性来获取元素个数。这是为了确保不会干扰垃圾回收机制对对象的处理。

因此,当需要存储临时数据或私有数据,并且希望避免内存泄漏时,使用WeakSet和WeakMap是更合适的选择。它们提供了一种轻量级、安全且不会造成内存泄漏的数据存储方式。

相关推荐
anyup_前端梦工厂2 小时前
了解几个 HTML 标签属性,实现优化页面加载性能
前端·html
前端御书房2 小时前
前端PDF转图片技术调研实战指南:从踩坑到高可用方案的深度解析
前端·javascript
2301_789169542 小时前
angular中使用animation.css实现翻转展示卡片正反两面效果
前端·css·angular.js
风口上的猪20153 小时前
thingboard告警信息格式美化
java·服务器·前端
程序员黄同学3 小时前
请谈谈 Vue 中的响应式原理,如何实现?
前端·javascript·vue.js
爱编程的小庄4 小时前
web网络安全:SQL 注入攻击
前端·sql·web安全
宁波阿成4 小时前
vue3里组件的v-model:value与v-model的区别
前端·javascript·vue.js
柯腾啊5 小时前
VSCode 中使用 Snippets 设置常用代码块
开发语言·前端·javascript·ide·vscode·编辑器·代码片段
Jay丶萧邦5 小时前
el-select:有关多选,options选项值不包含绑定值的回显问题
javascript·vue.js·elementui
weixin_535854225 小时前
oppo,汤臣倍健,康冠科技,高途教育25届春招内推
c语言·前端·嵌入式硬件·硬件工程·求职招聘