回答
- Map 和 Object 的相同点是都是 key-value 形式的存储结构。
- Map 相对于 Object 的区别主要是 3 点:
- Map 中的 key 可以是任意类型的值,而 Object 中的 key 只能是字符串。
- Map 中的 key 是有序的,而 Object 中的 key 是无序的。
- Map 在读取和遍历上性能更好。
WeakMap 相对于 Map 的区别在于,WeakMap 对 key 是弱引用,当 key 被垃圾回收时,value 也会被回收。
具体分析
Map 和 Object 的区别
Map 中的 key 可以是任意类型的值,而 Object 中的 key 只能是字符串。
- Map 中的 key 是有序的,而 Object 中的 key 是无序的。
- Map 在读取和遍历上性能更好。 ```typescript let a = new Map([ [“2”, 0], [“1”, 0], ]); let b = { “2”: 0, “1”: 0, };
console.log(…a.keys(), …Object.keys(b)); // 2 1 1 2
// 可以从结果中看出,map的遍历是有序的
<a name="cjzwD"></a>## Map 和 WeakMap 的区别1. 允许的 key 类型不同,在 WeakMap 中只允许1. WeakMap 解决了在 key 是 Object 的情况下,垃圾回收失效的问题。WeakMap 对 key 是弱引用,即垃圾回收机制不考虑此引用计数,保证在 key=null 时,key 和 value 同时被回收。1. 为了达到对 key 的弱引用目的,WeakMap 不可遍历。```typescriptrequire("expose-gc");function showMemory(key: string) {global.gc();console.log((process.memoryUsage().heapUsed / 1024 / 1024).toFixed(2),`// ${key}`);}const weakmap_key_null = () => {showMemory("_____weakmap_key_null");let key = new Array(5 * 1024 * 1024);const weakmap = new WeakMap();weakmap.set(key, 1);showMemory("创建weakmap");key = null;showMemory("weakmap,key=null");};const map_key_null = () => {showMemory("_____map_key_null");let key = new Array(5 * 1024 * 1024);const map = new Map();map.set(key, 1);showMemory("创建map");key = null;showMemory("map,key=null");};map_key_null();weakmap_key_null();// 可以从结果中看出,在 WeakMap 中 key=null,key 被正确回收;在 Map 中 key=null,key 不能被正确回收,因为在 Map 中保留了对 key 的引用,此时 map.size=1。
参考资料
- WeakMap - JavaScript | MDN [https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/WeakMap]
