有一个问题here,它类似于“当密钥在运行时未知时”。
当密钥未知时直到运行时,在对象上使用映射, 当所有键都是相同类型且所有值都是相同类型时。
当存在对各个元素进行操作的逻辑时使用对象。
我理解有关使用地图的建议“当密钥在运行时才知道”。
当所有键都是相同类型并且所有值都是相同类型时,我对此行感到困惑。他们试图在那里建议什么? 我的意思是,如果我的所有键都不是同一类型,我是否也不会被迫使用Map,因为它支持不同类型的键?另外,为什么值的类型决定了我是使用Map还是Object?
另外,我真的不明白“当存在对各个元素进行操作的逻辑时使用对象”。有人可以给我一个他们的意思吗?
答案 0 :(得分:5)
收藏品通常是同质的。您有从字符串到数字,从ID到对象,从用户名到User
实例的映射。所有键都具有相同的类型,并且所有值都具有相同的类型。您可以为任务选择其中任何一个。
如果你有不同的类型,你可能认为它们是它们的常见“超类”(极端情况下,你可能想要Object
→Object
)。如果你没有,这是一个代码味道,可能是一个错误。特别是当你有不同类型的钥匙时。
相反,对象应用作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],
…
]);