什么是可迭代协议
ES6 规定,如果一个对象具有符号属性Symbal.iterator
,并且属性值是一个迭代器的函数,则该对象是可迭代的(iterable)
for-of 循环
for-of 循环用于遍历可迭代对象,格式如下
//迭代完成后循环结束
for (const item of iterable) {
//iterable: 可迭代对象
//item: 每次迭代得到的数据
}
举个例子
现在有一个数组
const arr = [1, 2, 3, 4, 5]
我们用迭代器的方法遍历这个数组
const iterator = arr[Symbol.iterator]();
let result = iterator.next();
while (!result.done) {
const item = result.value; // 取出数据
console.log(item);
// 下一次迭代
result = iterator.next();
}
用 for-of 遍历
for (const item of arr) {
console.log(item);
}
这俩效果是一样的,上面迭代器的方法可以看作是 for-of 的语法糖
执行 for-of 的时候调用了 [Symblo.iterator]
我们可以自定义一个可迭代的对象,让对象以 { propName, propValue }的形式输出
var obj = {
a: 1,
b: 2,
[Symbol.iterator]() {
const keys = Object.keys(this);
let i = 0;
return {
next: () => {
const propName = keys[I];
const propValue = this[propName];
const result = {
value: {
propName,
propValue,
},
done: i >= keys.length
}
I++;
return result
}
}
}
}
for (const item of obj) {
console.log(item);
}
网友评论