js遍历与迭代器

105 阅读2分钟

数组遍历方法

  • map, find, findIndex, reduce, some, every, forEach,for of 其中map返回的是一个同等长度的数组。
    find返回符合条件的元素,findIndex返回符合条件元素的索引。 some和every返回布尔值。
    reduce用的较少,是个累加器。
const result = [1, 2, 3].reduce(function(accumulator, current) {
    return accumulator + current;
}) // 6

对象遍历方法

  • for in 遍历对象的属性
for(var key in obj){
    if (key == "age") {
       continue;
    }
}

跳出循环的方法

1 跳出本次循环

  • continue: for...in for...of for循环
  • return: forEach 2 跳出循环
  • break: for...in for...of for循环 while do while
  • try catch: forEach 等各种需要终止循环的程序

迭代器

迭代器是个对象,定义一个序列,在每次调用next()方法时,返回{value, done}。

// 自定义迭代器
function makeIterator(start, end, step) {
    let nextIndex = start;
    let iteratorCounter = 0;
    const tangle = {
        next: function() {
            let result;
            if (nextIndex <= end) {
                iteratorCounter++;
                nextIndex++;
                return { value: iteratorCounter, done: false};
            }
            return { value: iteratorCounter, done: true};
        }
    }
    return tangle;
}
var iterator = makeIterator(1, 4, 1);
iterator.next();
// 生成器函数
function* makeRangeIterator(start = 0, end = Infinity, step = 1) {
    for (let i = start; i < end; i += step) {
        yield i;
    }
}
var a = makeRangeIterator(1,10,2)
a.next() // {value: 1, done: false}

function* gen() {
  yield* ['a', 'b', 'c'];
}
var generation = gen();;
console.log(generation.next());
console.log(generation.next());

可迭代对象

若一个对象拥有可迭代行为,比如在for..of中会循环哪些值,则该对象是可迭代对象。
Map,Array拥有默认的可迭代行为,而Object则没有。
可以自定义可迭代对象。

var myIterable = {
  *[Symbol.iterator]() {
    yield 1;
    yield 2;
    yield 3;
  }
}

for (let value of myIterable) {
    console.log(value);
}
// 1
// 2
// 3

// 或者

[...myIterable]; // [1, 2, 3]

String, Array, Map等都属于内置的可迭代对象,因为它们的原型对象都拥有一个Symbol.iterator
可迭代对象可以使用for..of ,展开语法,yield*和解构赋值。