JavaScript 6中字典(Dictionary)和映射(Map)的区别是什么?

10

地图和字典/对象有何不同?

换句话说,let x = {}let x = new Map() 之间有什么区别?


3
Map对象是一个简单的键值对映射。任何值(包括对象和原始值)都可以作为键或值使用 - elclanrs
1
Mozilla的那个页面还有一个“对象和映射比较”的部分。 - Thilo
1
最大的区别在于 Map 可以使用任何值作为键(例如另一个对象),而使用 {} 则需要将字符串作为键。实际上,Map 可以包含具有 "1"1 键的不同项,但普通对象则不行。当然,Map 对象具有适用于 Map 对象的内置方法,而 {} 则没有。 - jfriend00
还有一件事需要记住:Map实例也是一个对象,可以像任何其他对象一样具有属性等。例如,您可以创建一个Map实例并为命名的函数方法提供对象。 - Pointy
我不理解对 MDN 的不断引用。语言规范非常清晰(至少在这方面),而且它具有权威参考的优势。 - RobG
1个回答

15

对象和映射的比较(来自 MDN):

对象与 Map 相似,都允许您将键设置为值,检索这些值,删除键以及检测是否在键处存储了某些东西。因此(并且因为没有内置的替代方案),历史上已将 Objects 用作 Maps; 然而,Objects 和 Maps 之间存在重要差异,使使用 Map 更好: - 对象具有原型,因此映射中有默认键。自 ES5 以来,可以通过使用 map = Object.create(null) 来绕过此问题,但很少这样做。 - 对象的键是字符串和符号,而对于 Map,它们可以是任何值。 - 您可以轻松地获取 Map 的大小,而必须手动跟踪对象的大小。
这并不意味着您应该在任何地方都使用 Maps,仍然大多数情况下使用 objects。 Map 实例仅适用于集合,并且您应该考虑调整先前使用对象的代码。 对象应被用作记录,带有字段和方法。 如果仍然不确定要使用哪个,请问自己以下问题: - 键通常在运行时未知,需要动态查找吗? - 所有值类型相同,可以互换使用吗? - 您需要非字符串键吗? - 键值对经常添加或删除吗? - 是否拥有任意(易于更改的)数量的键值对? - 集合是否被迭代?
这些都是您想要集合的 Map 的迹象。相反,如果您拥有固定数量的键,单独操作它们,并区分它们的使用,则需要对象。

2
另一个可能非常重要的事情是,JSON.stringify() 忽略了 Map 的内容。 - Pointy
1
请确保将我的MDN文本的引用格式化为引用符号 :-) - Bergi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接