何时在ES6中使用Object map vs Map类

时间:2018-09-16 14:37:20

标签: javascript ecmascript-6

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

似乎我可以在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" }
    ]],
    ...
]);

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

1 个答案:

答案 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可能会表现更好。