了解地图与对象MDN文档

use*_*596 6 javascript ecmascript-6

有一个问题在这里是类似的,但专门针对"键时,在运行时未知".

Map状态的MDN文档:

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

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

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

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

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

Ber*_*rgi 5

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

如果你有不同的类型,你可能意味着它们是一个共同的"超类"(极端,你可能想要ObjectObject).如果你没有,这是一个代码味道,可能是一个错误.特别是当你有不同类型的钥匙.

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


我们来看一些例子.

year ? 2015
month ? 9
day ? 28
Run Code Online (Sandbox Code Playgroud)

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

var date = {
    year: 2015,
    month: 9,
    day: 28
}
Run Code Online (Sandbox Code Playgroud)
format ? "MM/DD/YYY"
monthnames ? ["January", "February", …]
Run Code Online (Sandbox Code Playgroud)

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

var locale_en = {
    format: "MM/DD/YYY",
    monthnames: ["January", "February", …]
};
Run Code Online (Sandbox Code Playgroud)
en ? locale_en
de ? locale_de
fr ? locale_fr
…
Run Code Online (Sandbox Code Playgroud)

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

var locales = new Map([
    ["en", locale_en],
    ["de", locale_de],
    …
]);
Run Code Online (Sandbox Code Playgroud)