何时在 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 类 [重复]的主要内容,如果未能解决你的问题,请参考以下文章