簡體   English   中英

如何像ECMA6提案中一樣使用迭代器?

[英]How to use an iterator as is in the ECMA6 proposal?

我試圖弄清楚如何使用當前ECMA6草案中定義的迭代器。

迭代器建議如下:

function makeIterator(array){
    var nextIndex = 0;

    return {
       next: function(){
           return nextIndex < array.length ?
               {value: array[nextIndex++], done: false} :
               {done: true};
       }
    }
}

我覺得我錯過了一些東西,因為這意味着您必須以這種方式使用它:

var it = makeIterator(someArray);
var current = it.next();

while (current.done !== true){
    console.log(current.value);
    current = it.next();
}

因為,當然,這樣的事情會跳過值:

var it = makeIterator(someArray);

while (it.next().done !== true){
    console.log(it.next().value);
}

來自Java世界,我對它們為什么不包含hasNext函數感到困惑。 因為這將允許以下用法:

function makeBetterIterator(array){
    var nextIndex = 0;

    return {
       next: function(){
           return nextIndex < array.length ?
               {value: array[nextIndex++], done: false} :
               {done: true};
       },
       hasNext: function(){
            if(nextIndex < array.length){
                return true;
            }else{
                return false;
            }
       }
    }
}

var someArray = ["one", "two", "three", "four", "five"];

var it = makeBetterIterator(someArray)

while (it.hasNext() === true){
    console.log(it.next().value);
}

是否有使用迭代器的更簡單方法,或者應該怎么做? 如果沒有更簡單的方法,那么當顯然有更好的解決方案時,為什么要提出這樣的迭代器?

為了避免在while循環之前進行重復,您可以執行以下操作:

var it = makeIterator(someArray);

while (true) {
    var current = it.next();
    if (current.done) break;
    console.log(current.value);
}

但是實際上,在ES6中,您會這樣做:

for (var val of makeIterator(someArray)) {
    console.log(val);
}

ES6迭代器協議很簡單,因為Iterator Iterface僅需要一個方法( next ),該方法返回IteratorResult,其中包含donevalue 一旦該協議成為標准,那么實現它的任何東西都將獲得支持該協議的語言級語句的所有好處(例如for...of )。

這與更好的迭代器相同,但更為簡單:

  function makeIterator(array){ var nextIndex = 0; return { next: function(){ return nextIndex < array.length ? {value: array[nextIndex++], done: false} : false; } } } var someArray = ["one", "two", "three", "four", "five"]; var it = makeIterator(someArray); while (current = it.next()){ $('body').append(current.value+'<br>'); } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 

var arr = [1,2,3];

var it = arr[Symbol.iterator]();


for (var v, res; (res = it.next()) && !res.done; ) {
    v = res.value;
    console.log( v );
}

良好手冊http://2ality.com/2015/02/es6-iteration.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM