Map 与 Set
Map 与 Set
在面对各种复杂的需求时,我们可能会设计各种复杂的数据结构来解决问题,然而随着需求和功能的不断变化, Object
和 Array
的数据结构可能也无法满足我们的需求,因此出现了 Map
和 Set
。
Map
Map
是一种键值对的集合,它类似于对象,但是却不同于对象,Map
的键的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object
结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,在面对某些复杂的需求时,Map 可能比 Object 更合适。
Map 基本用法
Map
对象为我们提供了一些内置的操作方法,它们的基本用法如下:
new Map()
—— 创建 map。map.set(key, value)
—— 根据键存储值。map.get(key)
—— 根据键来返回值,如果 map 中不存在对应的 key,则返回 undefined。map.has(key)
—— 如果 key 存在则返回 true,否则返回 false。map.delete(key)
—— 删除指定键的值。map.clear()
—— 清空 map。map.size
—— 返回当前元素个数。
const map = new Map();
map.set('name', '张三');
map.set('age', 18);
map.set('gender', '男');
console.log(map.get('name')); // 输出:张三
console.log(map.has('name')); // 输出:true
console.log(map.has('address')); // 输出:false
map.delete('age');
console.log(map.has('age')); // 输出:false
map.clear();
console.log(map.size); // 输出:0
Map 遍历
Map
对象提供了一些内置的遍历方法,它们的基本用法如下:
map.keys()
—— 返回所有键名的遍历器。map.values()
—— 返回所有值的遍历器。map.entries()
—— 返回所有成员(键和值)的遍历器。
const map = new Map();
map.set('name', '张三');
map.set('age', 18);
map.set('gender', '男');
console.log(map.keys()); // 输出:MapIterator {'name', 'age', 'gender'}
console.log(map.values()); // 输出:MapIterator {'张三', 18, '男'}
console.log(map.entries()); // 输出:MapIterator {['name', '张三'], ['age', 18], ['gender', '男']}
Set
Set
是一个特殊的集合,它的结构类似与数组,但是在 Set
集合中的每个元素只允许出现一次,不能重复。
Set 基本用法
Set
对象为我们提供了一些内置的操作方法,它们的基本用法如下:
new Set(iterable)
—— 创建 set。set.add(value)
—— 向 set 中添加一个值。set.delete(value)
—— 删除 set 中的指定值。set.has(value)
—— 如果 value 存在则返回 true,否则返回 false。set.clear()
—— 清空 set。set.size
—— 返回当前元素个数。
const set = new Set();
set.add('张三');
set.add('李四');
set.add('王五');
set.add('张三');
console.log(set); // 输出:Set {'张三', '李四', '王五'}
console.log(set.size); // 输出:3
console.log(set.has('张三')); // 输出:true
console.log(set.has('赵六')); // 输出:false
set.delete('李四');
console.log(set.has('李四')); // 输出:false
set.clear();
console.log(set.size); // 输出:0
Set 遍历
Set
对象提供了一些内置的遍历方法,它们的基本用法如下:
set.keys()
—— 返回所有键名的遍历器。set.values()
—— 返回所有值的遍历器。set.entries()
—— 返回所有成员(键和值)的遍历器。
const set = new Set();
set.add('张三');
set.add('李四');
set.add('王五');
console.log(set.keys()); // 输出:SetIterator {'张三', '李四', '王五'}
console.log(set.values()); // 输出:SetIterator {'张三', '李四', '王五'}
console.log(set.entries()); // 输出:SetIterator {['张三', '张三'], ['李四', '李四'], ['王五', '王五']}
Set
集合同样可以使用 for...of
和 forEach
进行遍历。
const set = new Set();
set.add('张三');
set.add('李四');
set.add('王五');
for (let value of set.values()) {
console.log(value);
}
// 输出:
// 张三
// 李四
// 王五
set.forEach((value) => {
console.log(value);
})
// 输出:
// 张三
// 李四
// 王五
WeakMap
WeakMap
的数据结构与 Map
类似,但是它与 Map
不同,WeakMap
的键只限于对象,不能使用其他类型的值作为键。使用 WeakMap
的好处是,因为 WeakMap
的键是弱引用,所以当键所引用的对象被垃圾回收时,WeakMap
中的键值对也会被自动删除。
WeakMap 基本用法
WeakMap
对象为我们提供了一些内置的操作方法,它们的基本用法如下:
new WeakMap()
—— 创建 weakmap。weakmap.set(key, value)
—— 根据键存储值。weakmap.get(key)
—— 根据键来返回值,如果 weakmap 中不存在对应的 key,则返回 undefined。weakmap.has(key)
—— 如果 key 存在则返回 true,否则返回 false。weakmap.delete(key)
—— 删除指定键的值。
const weakmap = new WeakMap();
const obj = { name: '张三' };
weakmap.set(obj, '张三');
console.log(weakmap.get(obj)); // 输出:张三
console.log(weakmap.has(obj)); // 输出:true
console.log(weakmap.has('张三')); // 输出:false
weakmap.delete(obj);
console.log(weakmap.has(obj)); // 输出:false
WeakMap
不支持遍历以及 keys()
,values()
和 entries()
方法。
WeakSet
WeakSet
的数据结构与 Set
类似,但是它与 Set
不同,WeakSet
只允许向其集合中添加对象,不能使用其他类型的值。使用 WeakSet
的好处是,因为 WeakSet
中存储的对象是弱引用,所以当没有其他对象再访问到 WeakSet
中的对象时,WeakSet
中的对象会被自动清除(被垃圾回收机制回收)。
WeakSet 基本用法
WeakSet
对象为我们提供了一些内置的方法,它们的基本用法如下:
new WeakSet()
—— 创建 weakset。weakset.add(value)
—— 向 weakset 中添加一个值。weakset.delete(value)
—— 删除 weakset 中的指定值。weakset.has(value)
—— 如果 value 存在则返回 true,否则返回 false。
const weakset = new WeakSet();
const obj = { name: '张三' };
weakset.add(obj);
console.log(weakset.has(obj)); // 输出:true
console.log(weakset.has('张三')); // 输出:false
weakset.delete(obj);
console.log(weakset.has(obj)); // 输出:false
WeakSet
不支持遍历以及 keys()
,values()
和 entries()
方法。