一、迭代昰什么?
从一个数据集合中按照一定的顺序,不断的取出数据的过程
迭代与遍历的区别 :
- 迭代强调的是依次取出,不能确定取出的有多少,也不能保证把数据全部取完
迭代器的特点:
- 迭代器有得到下一个数据的能力
- 判断是否有后续数据的能力
- 数组存储的数据是有限的,迭代器只关心下一个
二、语法
迭代器是一个特殊的对象,它具有一些专门为迭代过程设计的专有接口,所有迭代器都有一个 next() 方法,每次调用都放回一个结果对象。
两个属性:
- value :表示下一个将要返回的值;
- done :判断迭代是否完成,返回布尔类型的值
迭代器还会保存一个内部指针,用来指向当前集合中值的位置,每调用一次 next() 方法,都会返回下一个可用的值。
function createIterator(items) {
var i = 0;
return {
next: function() {
var done = (i >= items.length);
var value = !done ? items[i++] : undefined;
return {
done: done,
value: value
};
}
};
}
var iterator = createIterator([1, 2, 3]);
console.log(iterator.next()); // "{ value: 1, done: false }"
console.log(iterator.next()); // "{ value: 2, done: false }"
console.log(iterator.next()); // "{ value: 3, done: false }"
console.log(iterator.next()); // "{ value: undefined, done: true }"
// 之后的所有调用
console.log(iterator.next()); // "{ value: undefined, done: true }"
在es6中,如果对象具有知名符号属性Symbol.iterator,则表示对象可以迭代
在es6及以后,数组可以直接创建迭代对象。
const arr = [468, 4685, 456, 4568, 351, 561, 456, 4564, 96];
const iter = arr[Symbol.iterator]();
let result = iter.next();
while (!result.done) {
console.log(result.value);
result = iter.next();
}
三、for of循环
for of 循环,专门用来遍历迭代的对象的,不是可迭代的对象不能使用for of遍历。
let values = [1,2,3];
for(let num of values) {
console.log(num)
}
for of循环每执行一次都会调用可迭代对象的 next() 方法,并将迭代器返回的结果对象的 value 属性存储在一个变量中,循环将持续执行直到返回对象的 done 属性的值为 true。