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