JavaScript之iterable_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
遍歷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]);
}
你可能會(huì)有疑問(wèn),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'
}
這就是為什么要引入新的for ... of循環(huán)。
然而,更好的方式是直接使用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);
});
相關(guān)文章
Javascript實(shí)時(shí)柱狀圖實(shí)現(xiàn)代碼
js實(shí)現(xiàn)的實(shí)時(shí)柱狀圖,非常有創(chuàng)意的想法。2008-10-10
JavaScript設(shè)計(jì)模式之觀察者模式與發(fā)布訂閱模式詳解
這篇文章主要介紹了JavaScript設(shè)計(jì)模式之觀察者模式與發(fā)布訂閱模式,結(jié)合實(shí)例形式詳細(xì)分析了JavaScript觀察者模式與發(fā)布訂閱模式相關(guān)概念、原理2020-05-05
fckeditor 獲取文本框值的實(shí)現(xiàn)代碼
獲取文本框值的實(shí)現(xiàn)代碼2009-02-02
layui-table獲得當(dāng)前行的上/下一行數(shù)據(jù)的例子
今天小編就為大家分享一篇layui-table獲得當(dāng)前行的上/下一行數(shù)據(jù)的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09
JS常用的幾種數(shù)組遍歷方式以及性能分析對(duì)比實(shí)例詳解
這篇文章主要介紹了JS常用的幾種數(shù)組遍歷方式以及性能分析對(duì)比,結(jié)合實(shí)例形式詳細(xì)分析了javascript針對(duì)數(shù)組遍歷的幾種常見(jiàn)使用方法及執(zhí)行效率對(duì)比,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2018-04-04
js使用文檔就緒函數(shù)動(dòng)態(tài)改變頁(yè)面內(nèi)容示例【innerHTML、innerText】
這篇文章主要介紹了js使用文檔就緒函數(shù)動(dòng)態(tài)改變頁(yè)面內(nèi)容,結(jié)合實(shí)例形式分析了JavaScript使用innerHTML、innerText函數(shù)動(dòng)態(tài)操作頁(yè)面元素相關(guān)使用技巧,需要的朋友可以參考下2019-11-11
原生js通過(guò)一行代碼實(shí)現(xiàn)簡(jiǎn)易輪播圖
這篇文章主要介紹了原生js一行代碼實(shí)現(xiàn)簡(jiǎn)易輪播圖功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2019-06-06
javascript HTML5文件上傳FileReader API
這篇文章主要介紹了javascript HTML5文件上傳FileReader API的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-04-04
safari,opera嵌入iframe頁(yè)面cookie讀取問(wèn)題解決方法
最近做的合作網(wǎng)站嵌入到對(duì)方的iframe中去,在safari,opera和有些版本的搜狗瀏覽器(內(nèi)核版本原因)中不能讀到cookie。2010-06-06

