use*_*596 6 javascript ecmascript-6
有一个问题在这里是类似的,但专门针对"键时,在运行时未知".
当密钥未知时直到运行时,并且当所有键都是相同类型且所有值都是相同类型时,请使用对象上的映射.
当存在对各个元素进行操作的逻辑时使用对象.
我理解有关使用地图的建议"当密钥在运行时才知道".
当所有键都是相同类型且所有值都是相同类型时,我对此行感到困惑.他们试图在那里建议什么?我的意思是,如果我的所有键都不是同一类型,我是否也不会被迫使用Map,因为它支持不同类型的键?另外,为什么值的类型决定了我是使用Map还是Object?
另外,我真的不明白"当存在对各个元素进行操作的逻辑时使用对象".有人能给我一个他们的意思吗?
集合通常是同质的.您有从字符串到数字,从ID到对象,从用户名到User实例的映射.所有键都具有相同的类型,并且所有值都具有相同的类型.您可以为任务选择其中任何一个.
如果你有不同的类型,你可能意味着它们是一个共同的"超类"(极端,你可能想要Object→ Object).如果你没有,这是一个代码味道,可能是一个错误.特别是当你有不同类型的钥匙.
相反,对象意味着用作记录:固定大小的字段组合.他们的成员用标识符表示,每个标识符可以有不同的类型.它们是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)