Map 是一种键值对的集合,类似于对象,但键可以是任意类型(对象、原始值等)。
let map = new Map();
// 设置键值对
map.set('name', 'John');
map.set(1, 'number one');
map.set(true, 'boolean true');
// 获取值
console.log(map.get('name')); // John
console.log(map.get(1)); // number one
// 检查键是否存在
console.log(map.has('name')); // true
// 删除键值对
map.delete(true);
// 清空Map
// map.clear();
// 大小
console.log(map.size); // 2
let recipeMap = new Map([
['cucumber', 500],
['tomatoes', 350],
['onion', 50]
]);
// 遍历键
for (let vegetable of recipeMap.keys()) {
console.log(vegetable); // cucumber, tomatoes, onion
}
// 遍历值
for (let amount of recipeMap.values()) {
console.log(amount); // 500, 350, 50
}
// 遍历键值对 [key, value]
for (let entry of recipeMap) { // 等同于 recipeMap.entries()
console.log(entry); // ['cucumber', 500], etc.
}
// forEach 方法
recipeMap.forEach((value, key, map) => {
console.log(`${key}: ${value}`); // cucumber: 500, etc.
});
Set 是一种值的集合,其中每个值只能出现一次(唯一性)。
let set = new Set();
let john = { name: "John" };
let pete = { name: "Pete" };
let mary = { name: "Mary" };
// 添加值
set.add(john);
set.add(pete);
set.add(mary);
set.add(john); // 重复添加会被忽略
set.add(mary);
console.log(set.size); // 3
// 检查值是否存在
console.log(set.has(john)); // true
// 删除值
set.delete(mary);
// 清空Set
// set.clear();
let set = new Set(["oranges", "apples", "bananas"]);
for (let value of set) {
console.log(value);
}
// 使用 forEach
set.forEach((value, valueAgain, set) => {
console.log(value);
});
数组去重
let values = ["Hare", "Krishna", "Hare", "Krishna", "Krishna", "Krishna"];
let unique = Array.from(new Set(values));
console.log(unique); // ["Hare", "Krishna"]
并集、交集、差集 ```javascript let a = new Set([1, 2, 3]); let b = new Set([4, 3, 2]);
// 并集 let union = new Set([...a, ...b]); // Set {1, 2, 3, 4}
// 交集 let intersection = new Set([...a].filter(x => b.has(x))); // Set {2, 3}
// 差集 (a 有 b 没有) let difference = new Set([...a].filter(x => !b.has(x))); // Set {1}
## WeakMap 和 WeakSet
### WeakMap
- 键必须是对象
- 键是弱引用(不影响垃圾回收)
- 不可迭代,没有 size 属性
- 使用场景:存储对象关联的元数据
```javascript
let weakMap = new WeakMap();
let obj = {};
weakMap.set(obj, "ok"); // 正常工作
// weakMap.set("test", "Whoops"); // 错误,键必须是对象
let visitedSet = new WeakSet();
let john = { name: "John" };
let pete = { name: "Pete" };
let mary = { name: "Mary" };
visitedSet.add(john); // John 访问了我们
visitedSet.add(pete); // 然后是 Pete
console.log(visitedSet.has(john)); // true
console.log(visitedSet.has(mary)); // false
Map 和 Set 是 ES6 引入的强大数据结构,在处理需要唯一值或复杂键的场景时非常有用。