Map和Set是ES6引入的高效数据结构,Map支持任意类型键、保持插入顺序且性能更优,适用于动态键值对存储;Set确保值唯一,常用于数组去重和快速查找。WeakMap与WeakSet通过弱引用避免内存泄漏,适合关联对象元数据。

JavaScript中的
Map
Set
Map
Set
理解
Map
Set
Map:更强大的键值对集合
在ES6之前,我们通常会用普通JavaScript对象(
{}Map
Map
Map
Map
Map
size
Map
Object.keys(obj).length
常用方法:
new Map()
map.set(key, value)
map.get(key)
map.has(key)
map.delete(key)
map.clear()
map.size
const myMap = new Map();
const objKey = { id: 1 };
const funcKey = () => console.log('I am a key');
myMap.set('name', 'Alice');
myMap.set(objKey, '这是一个对象作为键的值');
myMap.set(funcKey, '这是一个函数作为键的值');
myMap.set(123, '数字键');
console.log(myMap.get('name')); // Alice
console.log(myMap.get(objKey)); // 这是一个对象作为键的值
console.log(myMap.has('name')); // true
console.log(myMap.size); // 4
myMap.delete(123);
console.log(myMap.size); // 3
// 遍历Map
for (const [key, value] of myMap) {
console.log(`${typeof key}: ${key} => ${value}`);
}
// 输出示例:
// string: name => Alice
// object: [object Object] => 这是一个对象作为键的值
// function: () => console.log('I am a key') => 这是一个函数作为键的值Set:独一无二值的集合
Set
Set
Set
Set
Map
Set
size
Set
常用方法:
new Set()
set.add(value)
set.has(value)
set.delete(value)
set.clear()
set.size
const mySet = new Set();
mySet.add(1);
mySet.add(5);
mySet.add('text');
mySet.add(1); // 再次添加1,不会有任何效果
console.log(mySet.size); // 3
console.log(mySet.has(5)); // true
console.log(mySet.has(2)); // false
const arr = [1, 2, 2, 3, 4, 4, 5];
const uniqueArr = [...new Set(arr)]; // 快速去重
console.log(uniqueArr); // [1, 2, 3, 4, 5]
// 遍历Set
for (const value of mySet) {
console.log(value);
}
// 输出示例:
// 1
// 5
// text这真的是一个非常核心的问题,很多初学者会混淆。在我看来,
Map
Object
核心区别:
Object
obj[1]
obj['1']
obj[{}]obj['[object Object]']
Map
Map
Object
'1'
'2'
Map
Object
Object.keys(obj).length
Object.entries(obj).length
Map
size
map.size
Object
toString
hasOwnProperty
Map
Map
Object
Map
什么时候用Map?
Map
什么时候用Object?
{ name: 'Alice', age: 30 }Object
JSON.stringify
Map
Object
总结来说,如果你的需求只是一个简单的、键为字符串的静态数据集合,
Object
Map
Set
1. 数组去重:简洁与高效的完美结合
在
Set
使用
Array.prototype.filter()
indexOf()
const arr = [1, 2, 2, 3, 4, 4, 5]; const uniqueArrOld = arr.filter((item, index, self) => self.indexOf(item) === index); console.log(uniqueArrOld); // [1, 2, 3, 4, 5]
这种方法虽然能去重,但
indexOf
使用循环和临时对象/数组:
const arr = [1, 2, 2, 3, 4, 4, 5];
const uniqueArrLoop = [];
const seen = {};
for (const item of arr) {
if (!seen[item]) {
uniqueArrLoop.push(item);
seen[item] = true;
}
}
console.log(uniqueArrLoop); // [1, 2, 3, 4, 5]这种方法性能较好(接近O(n)),但代码量相对较多,且需要一个额外的
seen
网站模板是能够具有交互性,能够包含更多活跃的元素,就有必要在网页中嵌入其它的技术。如:Javascript、VBScript、Document Object Model(DOM,文档对象模型)、Layers和 Cascading Style Sheets(CSS,层叠样式表),这里主要讲Javascript。那么Javascript是什么东西?Javascript就是适应动态网页制作的需要而诞生的
70
有了
Set
const arr = [1, 2, 2, 3, 4, 4, 5, 'a', 'a', {id:1}, {id:1}];
const uniqueArrNew = [...new Set(arr)]; // 或者 Array.from(new Set(arr))
console.log(uniqueArrNew); // [1, 2, 3, 4, 5, 'a', {id:1}, {id:1}]
// 注意:对象字面量 {id:1} 被视为不同的引用,所以不会被去重。
// Set对于对象是基于引用地址判断唯一性的。
const arrWithObjects = [{id:1, name:'A'}, {id:2, name:'B'}, {id:1, name:'A'}];
// 如果想根据对象的某个属性去重,需要一些额外逻辑
const uniqueObjects = Array.from(new Set(arrWithObjects.map(o => JSON.stringify(o))))
.map(s => JSON.parse(s));
console.log(uniqueObjects); // [{id:1, name:'A'}, {id:2, name:'B'}][...new Set(arr)]
Set
Set
...
Array.from()
Set
2. 数据查找/存在性检查:从O(n)到近似O(1)的飞跃
当你需要频繁地检查一个值是否存在于一个大型集合中时,
Set
has()
传统数组查找:使用
Array.prototype.includes()
Array.prototype.indexOf()
const largeArray = Array.from({ length: 100000 }, (_, i) => i);
console.time('Array includes');
const existsInArray = largeArray.includes(99999); // O(n)
console.timeEnd('Array includes'); // 耗时可能在几毫秒到几十毫秒includes()
Set查找:使用
Set.prototype.has()
const largeArray = Array.from({ length: 100000 }, (_, i) => i);
const largeSet = new Set(largeArray); // 首次构建Set需要O(n)
console.time('Set has');
const existsInSet = largeSet.has(99999); // 平均O(1)
console.timeEnd('Set has'); // 耗时通常在0.x毫秒,非常快Set
has()
Set
何时利用Set的优势?
Set
has()
Set
在我看来,
Set
Map
当我们谈到
Map
Set
WeakMap
WeakSet
理解“弱引用”
在JavaScript中,当一个对象被引用时,垃圾回收器(Garbage Collector, GC)就不会回收它,即使它在程序的其他地方已经不再被使用了。这叫“强引用”。如果一个对象只被“弱引用”所持有,那么当没有任何其他强引用指向它时,垃圾回收器就可以把它清理掉,从而释放内存。
WeakMap
WeakSet
WeakMap
Map
WeakMap
WeakMap
WeakMap
WeakMap
size
WeakMap
size
for...of
WeakMap
WeakMap
set()
get()
has()
delete()
clear()
WeakMap的典型应用场景:
WeakMap
存储对象的私有数据:如果你想为一个对象添加一些额外的数据,但又不希望这些数据成为对象本身的一部分(比如避免枚举),并且希望当这个对象不再被使用时,这些额外数据也能自动被清理,
WeakMap
const privateData = new WeakMap();
class MyClass {
constructor(id) {
privateData.set(this, { id: id, count: 0 }); // 将私有数据与实例关联
}
increment() {
const data = privateData.get(this);
if (data) {
data.count++;
console.log(`ID: ${data.id}, Count: ${data.count}`);
}
}
}
let instance = new MyClass(101);
instance.increment(); // ID: 101, Count: 1
instance.increment(); // ID: 101, Count: 2
// 当 instance 不再被强引用时,它和 WeakMap 中对应的数据都会被垃圾回收
instance = null; // 移除强引用
// 此时,WeakMap中 {id: 101, count: 2} 这个数据也会被GC清理DOM元素的元数据:给DOM元素附加一些数据,当DOM元素从文档中移除并
以上就是什么是JS的Map和Set?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号