遍歷Array可以采用下標(biāo)循環(huán)综芥,遍歷Map和Set就無(wú)法使用下標(biāo)忘蟹。為了統(tǒng)一集合類(lèi)型泰演,ES6標(biāo)準(zhǔn)引入了新的iterable類(lèi)型呻拌,Array、Map和Set都屬于iterable類(lèi)型睦焕。
具有iterable類(lèi)型的集合可以通過(guò)新的for ... of循環(huán)來(lái)遍歷藐握。
for ... of循環(huán)是ES6引入的新的語(yǔ)法,請(qǐng)測(cè)試你的瀏覽器是否支持:
'use strict';
var a = [1, 2, 3];
for (var x of a) {
}
alert('你的瀏覽器支持for ... of');
★用for ... of循環(huán)遍歷集合垃喊,用法如下:
var a = ['A', 'B', 'C'];
var s = new Set(['A', 'B', 'C']);
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]);
}
for ... of循環(huán)和for ... in循環(huán)有何區(qū)別猾普?
for ... in循環(huán)由于歷史遺留問(wèn)題,它遍歷的實(shí)際上是對(duì)象的屬性名稱(chēng)缔御。一個(gè)Array數(shù)組實(shí)際上也是一個(gè)對(duì)象抬闷,它的每個(gè)元素的索引被視為一個(gè)屬性。
當(dāng)我們手動(dòng)給Array對(duì)象添加了額外的屬性后,for ... in循環(huán)將帶來(lái)意想不到的意外效果
var a = ['A', 'B', 'C'];
a.name = 'Hello';
for (var x in a) {
alert(x); // '0', '1', '2', 'name'
}
for ... in循環(huán)將把name包括在內(nèi)笤成,但Array的length屬性卻不包括在內(nèi)评架。
★【注意】for ... of循環(huán)則完全修復(fù)了這些問(wèn)題,它只循環(huán)集合本身的元素:
var a = ['A', 'B', 'C'];
a.name = 'Hello';
for (var x of a) {
alert(x); // 'A', 'B', 'C'
}
然而炕泳,更好的方式:
直接使用iterable內(nèi)置的★forEach方法纵诞,它接收一個(gè)函數(shù),每次迭代就自動(dòng)回調(diào)該函數(shù)培遵。
以Array為例:
var a = ['A', 'B', 'C'];
a.forEach(function (element, index, array) {
// element: 指向當(dāng)前元素的值
// index: 指向當(dāng)前索引
// array: 指向Array對(duì)象本身
alert(element);
});
【注意】forEach()方法是ES5.1標(biāo)準(zhǔn)引入的浙芙,你需要測(cè)試瀏覽器是否支持。
- Set與Array類(lèi)似籽腕,但Set沒(méi)有索引嗡呼,因此回調(diào)函數(shù)的前兩個(gè)參數(shù)都是元素本身:
var s = new Set(['A', 'B', 'C']);
s.forEach(function (element, sameElement, set) {
alert(element);
});
-
Map的回調(diào)函數(shù)參數(shù)依次為value、key和map本身:
var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
m.forEach(function (value, key, map) {
alert(value);
});
如果對(duì)某些參數(shù)不感興趣皇耗,由于JavaScript的函數(shù)調(diào)用不要求參數(shù)必須一致南窗,因此可以忽略它們。例如郎楼,只需要獲得Array的element:
var a = ['A', 'B', 'C'];
a.forEach(function (element) {
alert(element);
});