迭代器概念
const iterator = {
next() {
return { done: false, value: '11' }
}
};
const names = ['苏苏', '土狗', 'SharkDog'];
const arrIterator = {
next() {
return { done: false, value: '苏苏' };
return { done: false, value: '土狗' };
return { done: false, value: 'SharkDog' };
return { done: true };
}
};
数组迭代器
const nums = [1, 2, 3, 5, 8];
const names = ['苏苏', '土狗', 'SharkDog'];
function arrIterator(arr) {
let index = 0;
return {
next() {
if (index < arr.length) return { done: false, value: arr[index++] };
else return { done: true };
}
}
};
const numsIterator = arrIterator(nums);
const nameIterator = arrIterator(names);
console.log(numsIterator.next());
console.log(numsIterator.next());
console.log(numsIterator.next());
console.log(numsIterator.next());
console.log(numsIterator.next());
console.log(numsIterator.next());
console.log(numsIterator.next());
console.log(nameIterator.next());
console.log(nameIterator.next());
console.log(nameIterator.next());
console.log(nameIterator.next());
console.log(nameIterator.next());
无限迭代器
let index = 0;
const infinityIterator = {
next() {
return { done: false, value: index++ };
}
};
console.log(infinityIterator.next());
console.log(infinityIterator.next());
console.log(infinityIterator.next());
可迭代对象(iterable)[注意和迭代器是有区别的]
const iterableObj = {
names: ['苏苏', '土狗', 'SharkDog'],
[Symbol.iterator]: function () {
let index = 0;
return {
next: () => {
if (index < this.names.length) return { done: false, value: this.names[index++] };
else return { done: true };
}
}
}
};
const iterator = iterableObj[Symbol.iterator]();
const iterator2 = iterableObj[Symbol.iterator]();
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator2.next());
console.log(iterator2.next());
console.log(iterator2.next());
console.log(iterator2.next());
for (const iterator of iterableObj) {
console.log(iterator);
};
默认存在迭代器类型(因为对象不存在所以出现了可迭代对象的概念)
const str = '默认存在(Symbol.iterator)';
const names = ['苏苏', '土狗', 'SharkDog'];
const set = new Set([1, 2, 3, 5, 8, 13, 21]);
const arrIterator = names[Symbol.iterator]();
console.log(arrIterator.next());
console.log(arrIterator.next());
console.log(arrIterator.next());
console.log(arrIterator.next());
for (const strIterator of str) console.log(strIterator);
for (const arrIterator of names) console.log(arrIterator);
for (const setIterator of set) console.log(setIterator);
function foo() {
for (const argIterator of arguments) console.log(argIterator);
};
foo(1, 7, 5, 8, 2, 3);
可迭代对象应用场景
const str = '默认存在(Symbol.iterator)';
const names = ['苏苏', '土狗', 'SharkDog'];
const set = new Set([1, 2, 3, 5, 8, 13, 21]);
const obj = { name: '苏苏', age: 18 };
console.log(...str);
console.log({ ...str });
console.log([...str]);
console.log(...names);
console.log({ ...names });
console.log([...names]);
console.log(...set);
console.log({ ...set });
console.log([...set]);
console.log({ ...{ name: '土狗' }, ...obj });
const [f, , , , , , , , , , , , , , , , , , , , l] = str;
console.log(f, l);
const [first, , last] = names;
console.log(first, last);
const [one, , , , , , seven] = set;
console.log(one, seven);
const { name, age } = obj;
console.log(name, age);
定义可迭代类
class SelfInfo {
constructor(address, roomName, person) {
this.address = address;
this.roomName = roomName;
this.person = person;
};
entry(newPerson) {
this.person.push(newPerson);
};
[Symbol.iterator]() {
let index = 0;
return {
next: () => {
if (index < this.person.length) return { done: false, value: this.person[index++] };
else return { done: true };
},
return() {
console.info('迭代器被干预了!');
return { done: false };
}
}
}
};
const info = new SelfInfo('合肥', 'E5-1804', ['苏苏', '土狗', 'SharkDog']);
info.entry('安安');
for (const iterator of info) console.log(iterator);
for (const iterator of info) {
if (iterator == '土狗') continue;
if (iterator == 'SharkDog') break;
console.log(iterator);
};