假设我想创建一个字典,例如一个或多个模型的汽车制造。
似乎我可以在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" }
]],
...
]);
以上两种方法之间的主要区别和优缺点是什么?
答案 0 :(得分:4)
这是到目前为止我发现的差异:
Map允许您对密钥使用任何类型。因此,如果需要,您可以将整个对象存储在密钥中,其中对于索引签名,Typescript当前仅支持字符串或数字密钥。
ES6仅本地支持Map。如果定位到ES5或更低版本,则需要提供一个polyfill。
不确定这些是否详尽无遗。
编辑:刚刚在Mozilla文档中发现了一个Objects and maps compared部分,看起来很全面。
它包括以下未提及的项目:
Map中的键是有序的,而添加到对象的键则没有顺序。因此,在对其进行迭代时,Map对象将按插入顺序返回键。
使用size属性可以轻松获取Map的大小,而Object中的属性数必须手动确定。
Map是可迭代的,因此可以直接对其进行迭代,而对Object进行迭代需要以某种方式获取其键并对其进行迭代。
对象具有原型,因此如果不小心,地图中的默认键可能会与您的键冲突。从ES5开始,可以通过使用map = Object.create(null)绕过此方法,但这很少完成。
在频繁添加和删除密钥对的情况下,Map可能会表现更好。