何时在 ES6 中使用 Object map 与 Map 类 [重复]

Posted

技术标签:

【中文标题】何时在 ES6 中使用 Object map 与 Map 类 [重复]【英文标题】:When to use Object map vs Map class in ES6 [duplicate] 【发布时间】:2019-02-20 15:14:33 【问题描述】:

假设我想创建一个字典,例如,一个或多个模型的汽车制造商。

似乎我可以在 ES6 中以两种不同的方式做到这一点。

1.创建对象图:

代码:

const makesAndModels = 
    "mazda": [
         name: "Miata" ,
         name: "626" 
    ],
    "toyota": [
         name: "Camry" 
    ],
    ...
;

2。创建一个 ES6 Map 实例:

代码:

const makes = 
    mazda:  name: "Mazda" ,
    toyota:  name: "Toyota" 
;

const makesAndModels = new Map([
    [makes.mazda, [
         name: "Miata" ,
         name: "626" 
    ]],
    [makes.toyota, [
         name: "Camry" 
    ]],
    ...
]);

以上两种方法的主要区别和优缺点是什么?

【问题讨论】:

您在示例中创建的地图有一个严重的问题:您无法通过键获取值。因为映射使用标准相等性比较键并且无法自定义,所以makesAndModels[name: "Mazda"] 将始终评估为undefined 嗯,你是...将修复示例。 其实我有点误会了。您可以使用 map.keys 获取密钥。 我正在考虑概括这个问题,因为我认为它实际上通常适用于 javascript,而不仅仅是 Typescript。有人同意吗?如果是,请支持此评论? 您的第二个代码没有意义。为了与第一个比较,它也应该使用字符串作为 Map 的键 【参考方案1】:

以下是我迄今为止发现的差异:

Map 允许您使用任何类型的键。因此,如果您愿意,您可以将整个对象存储在密钥中,其中,对于索引签名,Typescript 目前仅支持字符串或数字键。

地图仅在 ES6 中被原生支持。如果面向 ES5 或更低版本,则需要提供 polyfill。

但不确定这些是否详尽。

编辑:刚刚在 Mozilla 文档中发现了一个 Objects and maps compared 部分,看起来非常全面。

它包括以下未提及的项目:

Map 中的键是有序的,而添加到对象的键不是。因此,在对其进行迭代时,Map 对象会按插入顺序返回键。

您可以通过 size 属性轻松获取 Map 的大小,而 Object 中的属性数量必须手动确定。

Map 是可迭代对象,因此可以直接迭代,而对 Object 进行迭代则需要以某种方式获取其键并对其进行迭代。

一个对象有一个原型,所以如果你不小心,映射中的默认键可能会与你的键发生冲突。从 ES5 开始,这可以通过使用 map = Object.create(null) 绕过,但很少这样做。

在涉及频繁添加和删除密钥对的场景中,Map 的性能可能会更好。

【讨论】:

Maps 的主要优势是能够使用任何值作为键,但由于缺乏可定制的相等性而显着削弱。 Set 和 Map 的 API 都是可悲的。 TC39 极大极小方法的又一次失败 注明。我想知道是否仍然值得使用 Map,希望 API 能够改进,这样我就不必更改所有代码。或者仅使用“对象映射”方法是否是一种更好的整体方法。 取决于用例。如果您只需要字符串、数字或符号键,请使用易于使用的对象,尤其是在 API 边界(如函数参数)处。如果您需要使用其他类型的值作为键,那么您必须使用映射。 WeakMap 还提供了简单对象无法提供的功能,无论关键要求如何。 WeakMap 非常强大,但您可能不会经常需要它。 另外值得一提的是Map默认不反序列化 从 ES2020 开始,Object.keys 是有序的。 ***.com/a/30919039/19212

以上是关于何时在 ES6 中使用 Object map 与 Map 类 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

ES6中的Map集合(与java里类似)

ES6躬行记(17)——Map

何时在 上使用 Map [重复]

ES6 Map

es6笔记Map数据结构

es6 map