JavaScript
中的默認(rèn)對(duì)象表示方式為{...}
,類似于iOS
中的 Dictionary
數(shù)據(jù)結(jié)構(gòu),即都用鍵值對(duì)組成蚁飒;
但是JavaScript的對(duì)象有個(gè)局限飒箭,就是鍵必須是字符串弦蹂,但實(shí)際上Number
或者其他數(shù)據(jù)類型作為鍵也是非常合理的凸椿,于是引進(jìn)了一個(gè)新的類型Map
, 一個(gè)也是由鍵值對(duì)組成的數(shù)據(jù)結(jié)構(gòu)削祈,但是其健可以是Number
或者其他數(shù)據(jù)類型;
Map
Map是一組鍵值對(duì)的結(jié)構(gòu),具有極快的查找速度
初始化Map
需要一個(gè)二維數(shù)組脑漫,或者直接初始化一個(gè)空Map
初始化方式一:
我們將一組人的 name
和 score
放到一個(gè)Map
中, 通過 name
查找對(duì)應(yīng) score
var m = new Map([["Michael", 95], ["Bob", 75], ["Tracy", 85]]);
m.get('Michael'); // 95
我們將一組人的 name
和 score
放到一個(gè)Map
中, 通過 score
查找對(duì)應(yīng) name
var m = new Map([[95, "Michael"], [75, "Bob"], [85, "Tracy"]]);
m.get(85); // "Tracy"
初始化方式二:
var m = new Map(); // 空Map
m.set("Adam", 67); // 添加新的key-value
m.set("Bob", 59);
m.has("Adam"); // 是否存在key "Adam": true
m.get("Adam"); // 67
m.delete("Adam"); // 刪除key 'Adam'
m.get("Adam"); // undefined
由于一個(gè)key只能對(duì)應(yīng)一個(gè)value髓抑,所以,多次對(duì)一個(gè)key放入value优幸,后面的值會(huì)把前面的值沖掉:
var m = new Map();
m.set("Adam", 67);
m.set("Adam", 88);
m.get("Adam"); // 88
Set
Set
類似與iOS
中的集合
Set
類似于數(shù)組吨拍,但是元素是無序的,而且不能重復(fù)
要?jiǎng)?chuàng)建一個(gè)Set
网杆,需要提供一個(gè)Array
作為輸入羹饰,或者直接創(chuàng)建一個(gè)空Set
var s1 = new Set(); // 空Set
var s2 = new Set([1, 2, 3]); // 含1, 2, 3
重復(fù)元素在Set
中自動(dòng)被過濾:
var s = new Set([1, 2, 3, 3, '3']);
s; // Set {1, 2, 3, "3"}
注意數(shù)字3
和字符串'3'
是不同的元素。
Set
的增刪操作:
var s = new Set([1, 2, 3]); // 含1, 2, 3
s.add(4); // Set {1, 2, 3, 4}
s.delete(3); // Set {1, 2, 4}
Iterable類型
遍歷Array
可以采用下標(biāo)循環(huán)碳却,遍歷Map
和Set
就無法使用下標(biāo)队秩。
Array
、Map
和Set
都屬于iterable
類型昼浦。
具有iterable
類型的集合可以通過新的for...of
循環(huán)來遍歷馍资。
用for ... of循環(huán)遍歷集合鸟蟹,用法如下:
// 數(shù)組 Array
var a = ["A", "B", "C"];
// 集合 Set
var s = new Set(["A", "B", "C"]);
// Map
var m = new Map([[1, "x"], [2, "y"], [3, "z"]]);
for (var x of a) { // 遍歷Array
alert(x);
}
for (var x of s) { // 遍歷Set
alert(x);
}
for (var x of m) { // 遍歷Map
alert(x[0] + '=' + x[1]); // x[0]->key值, x[1]->Value值
}
for ... of循環(huán)和for ... in循環(huán)有何區(qū)別荠察?
for...in
它遍歷的實(shí)際上是對(duì)象的屬性名稱。一個(gè)Array數(shù)組實(shí)際上也是一個(gè)對(duì)象,它的每個(gè)元素的索引被視為一個(gè)屬性脚翘。
for ... of
循環(huán),它只循環(huán)集合本身的元素
forEach
iterable內(nèi)置的forEach方法,它接收一個(gè)函數(shù)繁莹,每次迭代就自動(dòng)回調(diào)該函數(shù)
var a = ["A", "B", "C"];
a.forEach(function (element, index, array) {
// element: 指向當(dāng)前元素的值
// index: 指向當(dāng)前索引
// array: 指向Array對(duì)象本身
alert(element);
});
如果對(duì)某些參數(shù)不感興趣敬辣,可以忽略它們, 因?yàn)?code>JavaScript的函數(shù)調(diào)用不要求參數(shù)必須一致
var a = ["A", "B", "C"];
a.forEach(function (element) {
alert(element);
});