2016年7月23日 星期六

ECMAScript 6: Symbol Iterator, Generator

ES6 新增了可以做迭代器的 symbol 用法:

Array 迭代方式

let array = ["Ay","ay","ay","ay","canta y no llores"];
let iterator = array[Symbol.iterator]();

it.next(); //"Ay"
it.next(); //"ay"

Map 迭代方式


let map = new Map();
map.set("a",1);
map.set("b",2);
map.set("c",3);

let iterator = map[Symbol.iterator](); //第一種方式
let entries = map.entries(); //第二種方式

iterator.next(); //["a",1]
entries.next(); //["a",1]

可以被 FOR OF 迭代的 Iterator

let iterator = {
    [Symbol.iterator](){
        return this;
    },
    next(){
        return { value: "XX", done: true };
    }
}

Generator 產生器

產生器的寫法,會給 for of 之類可以呼叫 "next()" 的迭代方法操作,所以每個 yield 停頓點會在 next() 執行後移動到下一個 yield 之前。

常見寫法:
function *test(){ //加一個星號,這個 function 會自動符合 iterator 介面。
    yield 1;
    yield 2;
    yield 3;
}

for(let i of test()){
   console.log(i); //1..2..3
}

把陣列當成 generator 在傳:
function *test(){
    yield *[1,2,3,4,5,6,7,8]; //陣列自動變成可以被 iterating 的 generator;
    yield "HAHA"; //搗亂
}

for(let i of test()){
   console.log(i); //1..2..3..4..5..6..7..8..HAHA
}


Reference:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators

沒有留言:

張貼留言

© Mac Taylor, 歡迎自由轉貼。
Background Email Pattern by Toby Elliott
Since 2014