Javascript 在ES6中何时使用对象映射与映射类

Javascript 在ES6中何时使用对象映射与映射类,javascript,ecmascript-6,Javascript,Ecmascript 6,假设我想为一个或多个模型创建一个汽车制造词典 在ES6中,我似乎可以用两种不同的方式来实现这一点 1。创建对象映射: 代码: 2。创建ES6映射实例: 代码: 以上两种方法的主要区别和优缺点是什么?以下是我迄今为止发现的区别: Map允许您对密钥使用任何类型。因此,如果需要,可以将整个对象存储在键中,其中,对于索引签名,Typescript当前仅支持字符串键或数字键 Map仅在ES6中受本机支持。如果目标为ES5或更低,则需要提供polyfill 但不确定这些是否详尽无遗 编辑:刚刚在Moz

假设我想为一个或多个模型创建一个汽车制造词典

在ES6中,我似乎可以用两种不同的方式来实现这一点

1。创建对象映射:

代码:

2。创建ES6映射实例:

代码:


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

以下是我迄今为止发现的区别:

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

  • Map仅在ES6中受本机支持。如果目标为ES5或更低,则需要提供polyfill

但不确定这些是否详尽无遗

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

包括上述未提及的以下项目:

  • 贴图中的键是有序的,而添加到对象中的键不是有序的。因此,当对其进行迭代时,贴图对象将按插入顺序返回关键帧

  • 使用size属性可以轻松获得贴图的大小,而对象中属性的数量必须手动确定

  • 映射是一个iterable,因此可以直接迭代,而对对象进行迭代需要以某种方式获取其键并对其进行迭代

  • 一个对象有一个原型,因此如果你不小心的话,地图中的默认关键点可能会与你的关键点发生碰撞。从ES5开始,这可以通过使用map=Object.create(null)来绕过,但很少这样做

  • 在涉及频繁添加和删除密钥对的场景中,Map可能表现得更好


您在示例中创建的映射有一个严重问题:无法通过键获取值。因为地图使用标准等式比较关键点,而这无法自定义,
makesAndModels[{name:“Mazda”}]
将始终计算为
undefined
。啊,你说得对。。。我会修正这个例子。事实上,我有点搞错了。你可以用map.keys来获得键。我想概括一下这个问题,因为我认为它实际上适用于Javascript,而不仅仅是Typescript。有人同意吗?如果是的话,请投票支持此评论?您的第二个代码毫无意义。为了与第一种方法相比较,它应该使用字符串作为
Map
的键,同时,由于缺少可自定义的相等性,Map的主要优势(能够使用任何值作为键)显著降低。Set和Map的API都很可怜。注意到TC391最大最小方法的另一个故障。我想知道它是否值得继续使用Map,希望API能够改进,这样我就不必再修改我的所有代码了。或者仅仅使用“对象映射”方法是否是更好的总体方法。取决于用例。如果您只需要字符串、数字或符号键,请使用对象以便于使用,特别是在函数参数等API边界处。如果需要使用其他类型的值作为键,则必须使用映射。此外,WeakMap提供了简单对象无法提供的功能,无论关键需求是什么。WeakMap功能非常强大,但您可能不会经常需要它。另外值得一提的是,
Map
在ES2020对象的默认值下不会反序列化。密钥是有序的。
const makesAndModels = {
    "mazda": [
        { name: "Miata" },
        { name: "626" }
    ],
    "toyota": [
        { name: "Camry" }
    ],
    ...
};
const makes = {
    mazda: { name: "Mazda" },
    toyota: { name: "Toyota" }
};

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