Appearance
ES6 Map 和 Object 的区别
- 键的类型
在 Object 中,键必须是字符串或者 Symbols,而在 Map 中,键可以是任意类型,包括对象、函数、基本数据类型等。这使得 Map 在处理复杂键值关系时更加灵活。
- 键值对的顺序
Map 保留了插入顺序,而 Object 并不保证属性的顺序。当需要有序遍历键值对的时候,Map 是更合适的选择。
- 键值对的数量
Map 可以直接获取键值对的数量,通过 Map 的 size 属性进行访问,而 Object 需要手动遍历属性并计数。
- 性能和内存占用
在大量插入和删除键值对的操作中,Map 的性能更好。此外,Map 在存储大量键值对时,相对于 Object 有更低的内存占用。
- 迭代和遍历
Map 提供了更便捷的迭代和遍历方法,例如 forEach、for...of 等,可以直接对键值对进行操作。而 Object 需要使用 Object.keys()、Object.values() 或者 for...in 等方法进行遍历。
- 作为键的相等性
在 Map 中,两个键可以通过对象的引用相等判断,而在 Object 中,键必须使用相同的字符串或 Symbol。
- JSON 序列化
Map 不直接支持 JSON 序列化,而 Object 可以直接进行 JSON 序列化。
注意事项
Map 对象的 size 属性用于获取 Map 中键值对的数量。然而,通过直接在 Map 对象上添加属性并赋值,比如 a.xd = 1,并不会被计入到 Map 的 size 属性中。
Map 对象是一种特殊的数据结构,它只会将键值对作为有效的成员进行计数。通过 a.set(key, value) 方法来添加键值对,这样才会被 Map 认为是有效的成员,并计入到 size 属性中。