Javascript》》JS》》ES6》 Map、Set、WeakSet、WeakMap

Map(映射)

特点: 是键值对的集合,但键可以是任意类型(对象、函数、原始值),而不仅仅是字符串。

javascript 复制代码
// 使用对象作为键
const objKey = { id: 1 };
const myMap = new Map();

// 设置键值对
myMap.set(objKey, 'Value associated with objKey');
myMap.set('name', 'Alice');

// 获取值
console.log(myMap.get(objKey)); // 'Value associated with objKey'
console.log(myMap.get('name')); // 'Alice'

// 可迭代
for (let [key, value] of myMap) {
  console.log(key, value);
}
// 输出: { id: 1 } 'Value associated with objKey'
// 输出: name Alice

console.log(myMap.size); // 2

Set (集合)

特点: 是的集合,且值都是唯一的(没有重复项)。它更像是数学上的集合。

javascript 复制代码
const mySet = new Set();

// 添加值
mySet.add(1);
mySet.add(2);
mySet.add(2); // 重复添加,会被忽略
mySet.add('hello');

console.log(mySet); // Set(3) { 1, 2, 'hello' }

// 检查是否存在
console.log(mySet.has(2)); // true

// 可迭代
mySet.forEach(value => {
  console.log(value);
});

// 数组去重
const numbers = [1, 2, 3, 3, 4, 4, 5];
const uniqueNumbers = [...new Set(numbers)]; // [1, 2, 3, 4, 5]

console.log(mySet.size); // 3

WeakMap (弱映射)


常用场景:存储对象的私有数据或元数据:将数据与对象关联,且当对象被销毁时,希望关联的数据也能自动被清除,避免内存泄漏。

let obj1 = { id: 1 };

let obj2 = { id: 2 };

const myWeakMap = new WeakMap();

// 设置键值对

myWeakMap.set(obj1, 'Private data for obj1');

myWeakMap.set(obj2, 'This will be cleared');

console.log(myWeakMap.get(obj1)); // 'Private data for obj1'

// 删除对 obj2 的强引用

obj2 = null;

// 在未来的某个时刻,垃圾回收器会自动将 obj2 从内存中清除,

// 同时它在 myWeakMap 中的条目也会被自动移除。

// 我们无法手动检查或观察到这一瞬间,但可以确信它会发生。

WeakSet (弱集合)

**常用场景:**标记对象:例如跟踪一个对象是否已经被处理过,而不用担心内存管理问题。

javascript 复制代码
let objA = { name: 'A' };
let objB = { name: 'B' };

const checkedSet = new WeakSet();

// 标记对象
checkedSet.add(objA);
checkedSet.add(objB);

// 检查对象是否被标记过
console.log(checkedSet.has(objA)); // true

// 当 objA 在其他地方不再被引用并被回收后,它在 checkedSet 中的存在也会自动消失。
objA = null;
console.log(checkedSet.has(objA)); // false
相关推荐
一粒黑子2 小时前
【实战解析】阿里开源 PageAgent:纯前端 GUI Agent,一行JS让网页支持自然语言操控
前端·javascript·开源
IT枫斗者2 小时前
前端部署后如何判断“页面是不是最新”?一套可落地的版本检测方案(适配 Vite/Vue/React/任意 SPA)
前端·javascript·vue.js·react.js·架构·bug
九转成圣2 小时前
Java 性能优化实战:如何将海量扁平数据高效转化为类目字典树?
java·开发语言·json
Beginner x_u3 小时前
链表专题:JS 实现原理与高频算法题总结
javascript·算法·链表
SmartRadio3 小时前
ESP32-S3 双模式切换实现:兼顾手机_路由器连接与WiFi长距离通信
开发语言·网络·智能手机·esp32·长距离wifi
laowangpython3 小时前
Rust 入门:GitHub 热门内存安全编程语言
开发语言·其他·rust·github
我叫汪枫3 小时前
在后台管理系统中,如何递归和选择保留的思路来过滤菜单
开发语言·javascript·node.js·ecmascript
_.Switch3 小时前
东方财富股票数据JS逆向:secids字段和AES加密实战
开发语言·前端·javascript·网络·爬虫·python·ecmascript
软件技术NINI3 小时前
webkit简介及工作流程
开发语言·前端·javascript·udp·ecmascript·webkit·yarn
Brendan_0013 小时前
JavaScript的Stomp.over
开发语言·javascript·ecmascript