我正在学习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);
答案 0 :(得分:7)
- 哪些JavaScript规则允许您执行此操作?
carArrays
是一个对象(由{}
表示)。这意味着它将具有键值对,其中键指向特定值。但是,您需要定义这些键值对将是什么。目前您的对象为空,但是,您可以通过多种方式向其添加键值对:
直接:
let carArrays = {
"myKey": ["element1", "element2"]
}
使用dot-notation:
let carArrays = {};
carArrays.myKey = ["element1", "element2"];
...或使用bracket notation:
let carArrays = {};
carArrays["myKey"] = ["element1", "element2"];
以上所有添加键值对的方式都做同样的事情-它们将"myKey"
的键添加到carArrays
对象,其值是元素数组({{1} }。
关于括号符号的注意事项是,它允许您将键传递到对象中以对其进行定义,因此类似的事情也有效:
["element1", "element2"]
因此,当您执行代码时:
let carArrays = {};
let theKey = "myKey";
carArrays[theKey] = ["element1", "element2"]
...您正在使用括号符号将let carArrays = {};
carArrays[car1.year] = [car1, car2, car3];
的 key 设置为carArrays
中存储的值(例如:1999),它的值指向一组汽车元素(car1.year
)。
- 我认为[]表示数组。如果
[car1, car2, car3]
现在是地图,为什么要使用方括号将其索引?
如上所述,它不仅用于索引数组,而且还用于获取/设置对象的值。这称为bracket notation。如果深入研究Javascript,您会发现数组实际上只是对象,因此,在数组上使用carArrays
时,实际上是在使用括号符号。
- 我对carArrays成为地图的解释正确吗?还是仍将其视为键为“ 1999”和“ 2005”的对象?
JavaScript有两种主要方法将数据表示为键值对关系。一种方法是使用Map
类,另一种方法是使用对象[]
。 {}
和new Map
都允许您保留一个存储键-值对关系的数据结构。在您的代码中,您使用的是对象({}
,而不是{}
。而且,过去,在Javascript中我们并不总是拥有Map
类,因为它只是一个相对较新的添加(对ES6),因此主要使用对象(Map
)来代替。要查看{}
和对象之间的主要区别,可以看一下this answer或this comparison from MDN。
因此,对于您的代码,它仍然被认为是键为'1999'和'2005'的对象(因为您不是在代码的任何位置创建Map
对象,而是使用常规对象( new Map()
)来存储您的键值对。)
答案 1 :(得分:2)
要直接回答您的问题,carArrays
不是地图。
要正确定义地图,请参见this。具体来说,您可以使用数组或对象(其元素为键值对)来初始化地图,如下所示:
let myMap = new Map([[ 1, 'one' ],[ 2, 'two' ]]);
另一方面,car1
,car2
,car3
,car4
,car5
和car6
都是对象。 carArrays
是数组的对象,而不是数组。
代码:
carArrays[car1.year] = [car1, car2, car3];
仅在1999
中创建一个新的密钥或属性carArrays
,并为此密钥分配一个包含三个对象的数组:car1, car2, and car3
您可以像这样可视化carArrays
对象:
{'1999':
[
{
'make':'bmw',
'model':'3series',
'year':1999
},
{
'make':'ford',
'model':'crownvic',
'year':1999
},
{
'make':'honda',
'model':'accord',
'year':1999
}
],
'2005':
[
{
'make':'bentley',
'model':'5',
'year':2005
},
{
'make':'chevy',
'model':'silverado',
'year':2005
},
{
'make':'toyota',
'model':'rav4',
'year':2005
}
]
}
但是,对象和地图有一些相似之处和不同之处。您也可以在MDN site
上检查它们还要查看已接受的答案here,以进一步说明问题。
答案 2 :(得分:1)
如果运行代码并看到,console.log
将返回以下内容:
{
"1999": [
{
"make": "bmw",
"model": "3series",
"year": 1999
},
{
"make": "ford",
"model": "crownvic",
"year": 1999
},
{
"make": "honda",
"model": "accord",
"year": 1999
}
],
"2005": [
{
"make": "bentley",
"model": "5",
"year": 2005
},
{
"make": "chevy",
"model": "silverado",
"year": 2005
},
{
"make": "toyota",
"model": "rav4",
"year": 2005
}
]
}
大括号表示对象,而方括号表示数组。所以这段代码:
let carArrays = {};
carArrays[car1.year] = [car1, car2, car3];
carArrays[car4.year] = [car4, car5, car6];
创建一个新对象carArrays
,并创建两个键值对。关键是年份,而值是一组汽车对象。
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);