在 JavaScript 中,对象是最基本的数据结构之一。然而在某些情况下,我们需要一种更灵活、更高效的数据结构来存储和操作数据。ES6 中的 Map 和 WeakMap 就是这样的一个数据结构。
Map
Map 是一种可迭代的数据结构,其中的元素是以键值对的形式存储的。它可以用任何类型作为键,而不仅仅是字符串和数字。
初始化 Map
const map = new Map([ ['key1', 'value1'], ['key2', 'value2'], ['key3', 'value3'] ]); console.log(map.size); // 3
添加和删除元素
map.set('key4', 'value4'); map.delete('key3'); console.log(map.size); // 3
遍历 Map
map.forEach((value, key) => { console.log(`${key}: ${value}`); }); for (let [key, value] of map) { console.log(`${key}: ${value}`); }
使用对象作为键
在 Map 中使用对象作为键时,是根据其内存地址来判断是否相等的。
-- -------------------- ---- ------- ----- ---- - - ----- ------- -- ----- ---- - - ----- ----- -- ----- --- - --- ------ ------------- ---------- ------------- ---------- --------------------------- -- -------- --------------------- ----- ------- ---- -- ---------
性能更优
在对 Map 进行大量操作时,它的性能往往比普通对象好得多。这是因为 Map 内部使用了升级的 Hash 表来存储数据。
WeakMap
WeakMap 是一个与 Map 类似的数据结构,只不过其中的键值对中的键只能是对象,而且这些对象都是弱引用的。也就是说,只要对象不再被引用,它就会被自动从 WeakMap 中删除。
WeakMap 有一个重要的应用场景是存储对象的私有数据。由于对象的私有数据是通过 WeakMap 中的键来存储的,所以这些私有数据不会被对象本身持有,从而保证了对象的封装性。
以下是一个示例:
-- -------------------- ---- ------- ----- ----------- - --- ---------- ----- ------ - ----------------- - --------------------- - ---- --- - --------- - ------ --------------------------- - - ----- - - --- ---------------- ------------------------- -- ------- -------------------------------- -- ---------
性能和注意事项
由于 WeakMap 中的键都是弱引用的,所以它在内存管理方面要比 Map 更复杂。同时,由于 WeakMap 不可迭代,也不能够像 Map 那样遍历其中的元素。
总结
在 ES6 中,Map 和 WeakMap 提供了比普通对象更灵活、更高效的数据结构。它们的使用方法和注意事项与普通对象有所不同,但这些差异都为我们提供了更优秀的开发体验。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64821ae948841e9894181b96