试图了解看起来像对象作为地图的Javascript代码

swi*_*tie 2 javascript

我正在学习javascript,并遇到了一些类似于以下代码的Javascript代码。似乎carArrays仅通过将数组分配给即可将对象变成地图carArrays[car1.year]。因此,我对此代码有很多疑问。

  1. 哪些JavaScript规则允许您执行此操作?

  2. 我以为[]是阵列。如果carArrays现在是地图,为什么使用方括号将其索引?

  3. 关于carArrays成为地图,我的解释正确吗?还是仍将其视为具有键“ 1999”和“ 2005”的对象?

我的代码:

function car( make, model, year){
    this.make = make;
    this.model = model;
    this.year = year;
}

let car1 = new car('bmw', '3series', 1999);
let car2 = new car('ford', 'crownvic', 1999);
let car3 = new car('honda', 'accord', 1999);

let car4 = new car('bentley', '5', 2005);
let car5 = new car('chevy', 'silverado', 2005);
let car6 = new car('toyota', 'rav4', 2005);

let carArrays = {};
carArrays[car1.year] = [car1, car2, car3];
carArrays[car4.year] = [car4, car5, car6];

console.log(carArrays);
Run Code Online (Sandbox Code Playgroud)

Nic*_*ons 7

  1. 哪些JavaScript规则允许您执行此操作?

carArrays是一个对象(用表示{})。这意味着它将具有键值对,其中键指向特定值。但是,您需要定义这些键值对将是什么。当前您的对象为空,但是,您可以通过多种方式向其添加键值对:

直接

let carArrays = {
  "myKey": ["element1", "element2"]
}
Run Code Online (Sandbox Code Playgroud)

使用点符号

let carArrays = {};
carArrays.myKey = ["element1", "element2"];
Run Code Online (Sandbox Code Playgroud)

...或使用括号表示法

let carArrays = {};
carArrays["myKey"] = ["element1", "element2"];
Run Code Online (Sandbox Code Playgroud)

上面所有添加键值对的方式都做相同的事情-它们将键的值添加"myKey"carArrays对象,其值是元素数组(["element1", "element2"])。

关于括号符号的注意事项是,它允许您将键传递到对象中以对其进行定义,因此类似的内容也是有效的:

let carArrays = {};
let theKey = "myKey";
carArrays[theKey] = ["element1", "element2"]
Run Code Online (Sandbox Code Playgroud)

因此,当您执行代码时:

let carArrays = {};
carArrays[car1.year] = [car1, car2, car3];
Run Code Online (Sandbox Code Playgroud)

...您正在使用括号表示法设置为carArrays存储于car1.year(即:1999)的值的键,并且其值指向汽车元素数组([car1, car2, car3])。

  1. 我以为[]表示数组。如果carArrays现在是地图,为什么使用方括号将其索引?

如上所述,它不仅用于索引数组,还用于获取/设置对象的值。这就是括号表示法。如果深入研究Javascript,您会发现数组实际上只是对象,因此,[]在数组上使用数组时,实际上会再次使用括号表示法。

  1. 关于carArrays成为地图,我的解释正确吗?还是仍将其视为具有键“ 1999”和“ 2005”的对象?

Javascript有两种主要方法将数据表示为键值对关系。一种方法是使用Map类,另一种方法是使用object {}。双方new Map{}让你保持一个数据结构存储键值对的关系。在您的代码中,您使用的是对象({}),而不是Map。而且,过去,我们并不总是Map在Javascript中拥有该类,因为它只是对ES6的相对较新的添加,因此{}主要使用object()代替。要查看Map和对象之间的主要区别,您可以查看此答案MDN的比较

因此,对于您的代码,它仍被认为是键为'1999'和'2005'的new Map()对象(因为您不是在代码中的任何地方创建对象,而是使用常规对象({})存储键/值对)

  • 关于MDN的[比较对象和地图](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Map#Objects_and_maps_compared)部分可能是一个很好的参考。 (2认同)