HLJ 发布于
2025-06-11 09:48:11
0阅读

JavaScript Map and Set(映射和集合)

JavaScript Map and Set(映射和集合)

Map(映射)

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

Map 的迭代

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.
});

Map 与 Object 的区别

  1. Map 的键可以是任意类型,Object 的键只能是字符串或 Symbol
  2. Map 有 size 属性可以轻松获取元素数量
  3. Map 在频繁增删键值对的场景下性能更好
  4. Map 默认是可迭代的

Set(集合)

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();

Set 的迭代

let set = new Set(["oranges", "apples", "bananas"]);

for (let value of set) {
  console.log(value);
}

// 使用 forEach
set.forEach((value, valueAgain, set) => {
  console.log(value);
});

Set 的应用

  1. 数组去重

    let values = ["Hare", "Krishna", "Hare", "Krishna", "Krishna", "Krishna"];
    let unique = Array.from(new Set(values));
    console.log(unique); // ["Hare", "Krishna"]
    
  2. 并集、交集、差集 ```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"); // 错误,键必须是对象

WeakSet

  • 只能存储对象
  • 对象是弱引用
  • 不可迭代,没有 size 属性
  • 使用场景:标记对象
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 引入的强大数据结构,在处理需要唯一值或复杂键的场景时非常有用。

当前文章内容为原创转载请注明出处:http://www.good1230.com/detail/2025-06-11/796.html
最后生成于 2025-06-13 20:52:48
此内容有帮助 ?
0