写在前面
迭代器 (Iterator) 是指满足迭代器协议的对象。
可迭代对象是指原生部署了 Iterator(迭代器) 接口的对象,这种对象是可遍历的或可迭代的,因此称作可迭代对象。ES6 中的可迭代对象有很多,不同的迭代对象除了有统一的 Iterator接口外,还有其自定义的迭代接口。
1. 迭代器
1.1 概念
迭代器协议: 对象的next
方法是一个无参函数,它返回一个对象,该对象拥有done
和value
两个属性:
done
(boolean
):- 如果迭代器已经经过了被迭代序列时为
true
。这时value
可能描述了该迭代器的返回值。 - 如果迭代器可以产生序列中的下一个值,则为
false
。这等效于连同done
属性也不指定。
- 如果迭代器已经经过了被迭代序列时为
value
: 迭代器返回的任何 JavaScript值。done
为true
时可省略。
ES5实现一个简单的迭代器:
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 }"
2. 可迭代对象
2.1 String
2.2 Array
2.3 TypedArray
2.4 Set
2.5 Map
2.6 函数的 arguments 对象
2.7 NodeList 对象
3. 可迭代对象的使用场景
可迭代对象可以在以下语句中使用:
-
for (let value of ['a', 'b', 'c']) {
console.log(value);
}
// "a"
// "b"
// "c"
-
[...'abc']; // ["a", "b", "c"]
console.log(...['a', 'b', 'c']); // ["a", "b", "c"]
-
let [a, b, c] = new Set(['a', 'b', 'c']);
a; // 'a'