我正在学习javascript,并遇到了一些类似于以下代码的Javascript代码。似乎carArrays仅通过将数组分配给即可将对象变成地图carArrays[car1.year]。因此,我对此代码有很多疑问。
哪些JavaScript规则允许您执行此操作?
我以为[]是阵列。如果carArrays现在是地图,为什么使用方括号将其索引?
关于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)
- 哪些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])。
- 我以为[]表示数组。如果
carArrays现在是地图,为什么使用方括号将其索引?
如上所述,它不仅用于索引数组,还用于获取/设置对象的值。这就是括号表示法。如果深入研究Javascript,您会发现数组实际上只是对象,因此,[]在数组上使用数组时,实际上会再次使用括号表示法。
- 关于carArrays成为地图,我的解释正确吗?还是仍将其视为具有键“ 1999”和“ 2005”的对象?
Javascript有两种主要方法将数据表示为键值对关系。一种方法是使用Map类,另一种方法是使用object {}。双方new Map并{}让你保持一个数据结构存储键值对的关系。在您的代码中,您使用的是对象({}),而不是Map。而且,过去,我们并不总是Map在Javascript中拥有该类,因为它只是对ES6的相对较新的添加,因此{}主要使用object()代替。要查看Map和对象之间的主要区别,您可以查看此答案或MDN的比较。
因此,对于您的代码,它仍被认为是键为'1999'和'2005'的new Map()对象(因为您不是在代码中的任何地方创建对象,而是使用常规对象({})存储键/值对)