ES6新特性二:Iterator(遍歷器)和for-of循環(huán)詳解
本文實(shí)例講述了ES6新特性之Iterator(遍歷器)和for-of循環(huán)。分享給大家供大家參考,具體如下:
1. 遍歷數(shù)組
for-of工作原理:迭代器有一個(gè)next方法,for循環(huán)會(huì)不斷調(diào)用這個(gè)iterator.next方法來獲取下一個(gè)值,直到返回值中的 done屬性為true的時(shí)候結(jié)束循環(huán)。
① 在ES6之前
var arr = [1,2,3,4,5,6]; arr.name = 'a'; for (var index = 0; index < arr.length; index++) { console.log(arr[index]); } arr.forEach(function (value) { //ES5 內(nèi)建的forEach方法 缺陷:無法使用break 中斷 ,也不能使用return 語(yǔ)句返回到外層函數(shù) console.log(value); });
結(jié)果都是:1,2,3,4,5,6
② 用 for-in :作用于數(shù)組的 forfor -in 循環(huán)體除了遍歷數(shù)組元素外,還會(huì)遍歷自定義屬性。比如數(shù)組有一個(gè)可枚舉屬性arr.a,循環(huán)將額外執(zhí)行一次
for (var index in arr) { // 千萬別這樣做 console.log(arr[index]); }
結(jié)果:1,2,3,4,5,6,a
for-in 是為普通對(duì)象設(shè)計(jì)的,賦值給index的值不是實(shí)際的數(shù)字1、2,而是字符串‘1',‘2'
var b = 0; for (var index in arr) { b = b+ index; console.log(b) }
結(jié)果:00,001,0012,00123,001234,0012345,0012345name
③ 使用 for-of:避開了for-in 的所有缺陷,可以正確響應(yīng) break、return 語(yǔ)句
for(var value of arr){ console.log(value) }
結(jié)果:1,2,3,4,5,6
2.for-of 循環(huán)便利其他集合
① 遍歷Set
var words = 'a'; var s = new Set(); s.add("a"); s.add(1); for(var word of s){ console.log(word); }
結(jié)果:a,1
② 遍歷Map
var map = new Map(); map.set('a',1); map.set('b',2); map.set('c',3); map.set('d',4); for(var [key,value] of map){ console.log(key+':'+value); }
結(jié)果:a:1,b:2,c:3,d:4
3. Iterator(遍歷器)
① 遍歷器(Iterator)是一種接口規(guī)格,任何對(duì)象只要部署這個(gè)接口,就可以完成遍歷操作。它的作用有兩個(gè),一是為各種數(shù)據(jù)結(jié)構(gòu),提供一個(gè)統(tǒng)一的、簡(jiǎn)便的接口,二是使得對(duì)象的屬性能夠按某種次序排列。
② 遍歷器的原理:遍歷器提供了一個(gè)指針,指向當(dāng)前對(duì)象的某個(gè)屬性,使用next方法,就可以將指針移動(dòng)到下一個(gè)屬性。next方法返回一個(gè)包含value和done兩個(gè)屬性的對(duì)象。其中,value屬性是當(dāng)前遍歷位置的值,done屬性是一個(gè)布爾值,表示遍歷是否結(jié)束。
//模擬遍歷器原理 function makeIterator(array){ var nextIndex = 0; return { next: function(){ return nextIndex < array.length ? {value: array[nextIndex++], done: false} : {value: undefined, done: true}; } } } var it = makeIterator(['a', 'b']); console.log(it.next());//{ value: 'a', done: false } console.log(it.next());//{ value: 'b', done: false } console.log(it.next());//{ value: undefined, done: true }
③ Iterator接口返回的遍歷器,原生具備next方法。
> 有三類數(shù)據(jù)結(jié)構(gòu)原生具備Iterator接口:數(shù)組、類似數(shù)組的對(duì)象、Set和Map結(jié)構(gòu)。
var map = new Map(); console.log(map[Symbol.iterator] === map.entries)//true var arr = new Array(); console.log(arr[Symbol.iterator] === arr.values)//true var set = new Set(); console.log(set[Symbol.iterator] === set.values)//true
> 其他數(shù)據(jù)結(jié)構(gòu)(主要是對(duì)象)如果需要Iterator接口,都需要自己部署。
var students = {} students[Symbol.iterator] = function() { let index = 1; return { next() { return {done: index>10, value: index++} } } } for(var i of students) { console.log(i); }//
希望本文所述對(duì)大家ECMAScript程序設(shè)計(jì)有所幫助。
- ES6中非常實(shí)用的新特性介紹
- JavaScript ES6的新特性使用新方法定義Class
- JavaScript中的Reflect對(duì)象詳解(ES6新特性)
- 深入淺出ES6新特性之函數(shù)默認(rèn)參數(shù)和箭頭函數(shù)
- 簡(jiǎn)單談?wù)凟S6的六個(gè)小特性
- ES6新特性之Symbol類型用法分析
- ES6(ECMAScript 6)新特性之模板字符串用法分析
- ES6新特性之變量和字符串用法示例
- ES6新特性之模塊Module用法詳解
- ES6新特性之字符串的擴(kuò)展實(shí)例分析
- ES6新特性六:promise對(duì)象實(shí)例詳解
- ES6新特性七:數(shù)組的擴(kuò)充詳解
- ES6新特性八:async函數(shù)用法實(shí)例詳解
- ES6新特性之類(Class)和繼承(Extends)相關(guān)概念與用法分析
- 讓微信小程序支持ES6中Promise特性的方法詳解
- ES6新特性:使用export和import實(shí)現(xiàn)模塊化詳解
- es6新特性之 class 基本用法解析
- ES6 13個(gè)新特性總結(jié)
相關(guān)文章
JS前端開發(fā)模擬虛擬dom轉(zhuǎn)真實(shí)dom詳解
這篇文章主要為大家介紹了JS前端開發(fā)模擬虛擬dom轉(zhuǎn)真實(shí)dom詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01使用layui日期控件laydate對(duì)開始和結(jié)束時(shí)間進(jìn)行聯(lián)動(dòng)控制的方法
今天小編就為大家分享一篇使用layui日期控件laydate對(duì)開始和結(jié)束時(shí)間進(jìn)行聯(lián)動(dòng)控制的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09微信小程序?qū)崿F(xiàn)登陸注冊(cè)滑塊驗(yàn)證
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)登陸注冊(cè)滑塊驗(yàn)證,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05基于JavaScript實(shí)現(xiàn)前端文件的斷點(diǎn)續(xù)傳
這篇文章主要介紹了基于JavaScript實(shí)現(xiàn)前端文件的斷點(diǎn)續(xù)傳的相關(guān)資料,需要的朋友可以參考下2016-10-10JavaScript利用事件循環(huán)實(shí)現(xiàn)數(shù)據(jù)預(yù)加載
當(dāng)我們請(qǐng)求好第一頁(yè)數(shù)據(jù)后,將請(qǐng)求下一頁(yè)放到異步任務(wù)隊(duì)列里(宏任務(wù)或者微任務(wù)),等當(dāng)前同步任務(wù)執(zhí)行完成后,立馬請(qǐng)求下一頁(yè)數(shù)據(jù),本文給大家介紹了JavaScript如何利用事件循環(huán)實(shí)現(xiàn)數(shù)據(jù)預(yù)加載,需要的朋友可以參考下2024-05-05微信小程序網(wǎng)絡(luò)請(qǐng)求實(shí)現(xiàn)過程解析
這篇文章主要介紹了微信小程序網(wǎng)絡(luò)請(qǐng)求實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11JavaScript實(shí)現(xiàn)div的鼠標(biāo)拖拽效果
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)div的鼠標(biāo)拖拽效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11