一、什么是迭代器?
生成器概念在Java,Python等語言中都是具備的,ES6也添加到了JavaScript中。Iterator可以使我們不需要初始化集合,以及索引的變量,而是使用迭代器對象的 next 方法,返回集合的下一項的值,偏向程序化。
迭代器是帶有特殊接口的對象。含有一個next()方法,調用返回一個包含兩個屬性的對象,分別是value和done,value表示當前位置的值,done表示是否迭代完,當為true的時候,調用next就無效了。
ES5中遍歷集合通常都是 for循環,數組還有 forEach 方法,對象就是 for-in,ES6 中又添加了 Map 和 Set,而迭代器可以統一處理所有集合數據的方法。迭代器是一個接口,只要你這個數據結構暴露了一個iterator的接口,那就可以完成迭代。ES6創造了一種新的遍歷命令for...of循環,Iterator接口主要供for...of消費。
二、如何使用迭代器?
1、默認 Iterator 接口
數據結構只要部署了 Iterator 接口,我們就成這種數據結構為“可遍歷”(Iterable)。ES6 規定,默認的 Iterator 接口部署在數據結構的 Symbol.iterator 屬性,或者說,一個數據結構只要具有 Symbol.iterator 數據,就可以認為是“可遍歷的”(iterable)。
可以供 for...of 消費的原生數據結構
可以看上面的原生數據結構中并沒有對象(Object),為什么呢?
那是因為對象屬性的遍歷先后順序是不確定的,需要開發者手動指定。本質上,遍歷器是一種線性處理,對于任何非線性的數據結構,部署遍歷器接口就等于部署一種線性變換。
做如下處理,可以使對象供 for...of 消費:
// code1function Obj(value) { this.value = value; this.next = null;}Obj.prototype[Symbol.iterator] = function() { var iterator = { next: next }; var current = this; function next() { if (current) { var value = current.value; current = current.next; return { done: false, value: value }; } else { return { done: true }; } } return iterator;}var one = new Obj(1);var two = new Obj(2);var three = new Obj(3);one.next = two;two.next = three;for (var i of one) { console.log(i);}// 1// 2// 32、調用 Iterator 接口的場合
(1) 解構賦值
// code2let set = new Set().add('a').add('b').add('c');let [x,y] = set;// x='a'; y='b'let [first, ...rest] = set;// first='a'; rest=['b','c'];(2) 擴展運算符
// code3// 例一var str = 'hello';[...str] // ['h','e','l','l','o']// 例二let arr = ['b', 'c'];['a', ...arr, 'd']// ['a', 'b', 'c', 'd']
新聞熱點
疑難解答
圖片精選