编辑代码

//返回一个可迭代对象,迭代的结果是对传入的可迭代对象的每个值应用f()的结果
function map(iterable, f){
    //返回迭代器对象 具有next方法
    let iterator = iterable[Symbol.iterator]();
    return {
        [Symbol.iterator](){
            return this;
        },
        next(){
            let v = iterator.next();
            if(v.done){
                return v;
            }else{
                return {
                    value: f(v.value)
                }
            }
        }
    }
}
console.log([...map([1,2,3,4], x => Math.pow(x, 2))]);


function filter(iterable, predicate){
    let iterator = iterable[Symbol.iterator]();
    let index = 0;
    return {
        [Symbol.iterator](){
            return this;
        },
        next(){
            for(;;){
                let v = iterator.next();
                if(v.done || predicate(v.value)){
                    return v;
                }
            }
        }
    }
};
console.log([...filter([1,2,3,4,5,6,7,8,9,10], x => x % 2 === 0)]);

function words(s){
    var r = /\s+|$/g;
    r.lastIndex = s.match(/[^ ]/).index;
    return {
        [Symbol.iterator](){
            return this;
        },
        next(){
            let start = r.lastIndex;
            console.log(start)
            if(start < s.length){
                let match = r.exec(s);
                console.log(match);
                if(match){
                    return {
                        value: s.substring(start, match.index)
                    }
                }
            }
            return { done: true }
        }
    }
}
console.log([...words(" abc  def ghi! ")]);