了解地图与对象MDN文档

时间:2015-10-28 13:09:47

标签: javascript ecmascript-6

有一个问题here,它类似于“当密钥在运行时未知时”。

MDN docs for Map州:

  

当密钥未知时直到运行时,在对象上使用映射,   当所有键都是相同类型且所有值都是相同类型时。

     

当存在对各个元素进行操作的逻辑时使用对象。

我理解有关使用地图的建议“当密钥在运行时才知道”。

当所有键都是相同类型并且所有值都是相同类型时,我对此行感到困惑。他们试图在那里建议什么? 我的意思是,如果我的所有键都不是同一类型,我是否也不会被迫使用Map,因为它支持不同类型的键?另外,为什么值的类型决定了我是使用Map还是Object?

另外,我真的不明白“当存在对各个元素进行操作的逻辑时使用对象”。有人可以给我一个他们的意思吗?

1 个答案:

答案 0 :(得分:5)

收藏品通常是同质的。您有从字符串到数字,从ID到对象,从用户名到User实例的映射。所有键都具有相同的类型,并且所有值都具有相同的类型。您可以为任务选择其中任何一个。

如果你有不同的类型,你可能认为它们是它们的常见“超类”(极端情况下,你可能想要ObjectObject)。如果你没有,这是一个代码味道,可能是一个错误。特别是当你有不同类型的钥匙时。

相反,对象应用作records:固定大小的字段的组合。他们的成员标识符表示,每个成员可能有不同的类型。它们是JavaScript中的属性,由字符串或符号键入。您可以单独引用它们,并将它们用于不同的目的。

让我们看一些例子。

year → 2015
month → 9
day → 28

是的,所有键都是字符串,所有值都是数字。但我们绝对不希望获得更多或更少。我们使用记录:

var date = {
    year: 2015,
    month: 9,
    day: 28
}
format → "MM/DD/YYY"
monthnames → ["January", "February", …]

显然,不同的价值类型。我们将单独使用它们。再一次,一个对象:

var locale_en = {
    format: "MM/DD/YYY",
    monthnames: ["January", "February", …]
};
en → locale_en
de → locale_de
fr → locale_fr
…

这显然是另一回事。注意省略号?还有更多。所有键都是语言代码,所有值都是语言环境。使用它们时,我们只会使用其中之一。这是一个集合:

var locales = new Map([
    ["en", locale_en],
    ["de", locale_de],
    …
]);