2026-04-20 18:41:00
JavaScript中Object和Map、WeakMap的区别:
一、Object与Map的区别
键的类型:
Object:传统的对象只能用字符串作为键名,这在使用上造成了很大的限制。
Map:Map本质上是一个键值对的集合,键名不限于字符串,可以是任意类型的数据(包括对象、函数等)。这弥补了传统对象的不足。
原型链与默认键:
Object:Object有原型链,原型链上有一些默认的键(如__proto__),这可能会影响键值对的添加和访问。
Map:Map没有原型链,默认情况下不包含任何键,所有键都是自己添加进去的,因此不会受到原型链上默认键的影响。
键值对数量获取:
Object:需要手动计算键值对的数量。
Map:可以通过size属性轻易获取键值对的数量。
性能:
Object:在频繁增删键值对的场景下,性能可能不如Map。
Map:在频繁增删键值对的场景下,性能优于Object。
使用场景:
当要添加的键值名和Object上的默认键值名冲突,又不想改名时,用Map。
需要String和Symbol以外的数据类型做键值时,用Map。
键值对很多,有需要计算数量时,用Map。
需要频繁增删键值对时,用Map。
二、Map与WeakMap的区别
键的类型:
Map:键可以是任意类型的数据。
WeakMap:只接受对象作为键名(null除外),不接受其他类型的值作为键名。
键的引用类型:
Map:键是强引用,键所指向的对象不会被垃圾回收机制自动回收,除非手动删除键值对。
WeakMap:键是弱引用,键所指向的对象可以被垃圾回收机制自动回收。一旦对象不再被其他强引用所引用,垃圾回收机制就会释放该对象所占用的内存,此时WeakMap中的键也会变得无效。
遍历性:
Map:可以被遍历,可以使用for...of循环、forEach方法、keys()、values()、entries()等方法遍历键值对。
WeakMap:不能被遍历,因为WeakMap内部成员的数量取决于垃圾回收机制是否执行,运行前后成员个数很可能是不一样的,而垃圾回收机制的执行是不可预测的。
使用场景:
WeakMap适用于需要在某些对象上存储数据,但又不想影响这些对象的垃圾回收的场景。例如,可以在DOM元素上存储一些临时数据,而不用担心这些数据会影响DOM元素的垃圾回收。
总结: