返回

遍历枚举骚操作之惊天大逆袭

前端

迭代器接口
迭代器接口是一个对象,它提供了一个next()方法,该方法返回一个对象,其中包含一个done属性和一个value属性。done属性是一个布尔值,表示迭代是否完成。value属性是当前迭代项的值。

可以手动创建一个迭代器,方法是定义一个对象,该对象实现Symbol.iterator方法。Symbol.iterator方法返回一个迭代器对象。

const myIterable = {
  [Symbol.iterator]() {
    let i = 0;
    return {
      next() {
        if (i < 3) {
          return { value: i++, done: false };
        } else {
          return { value: undefined, done: true };
        }
      }
    };
  }
};

for (const item of myIterable) {
  console.log(item); // 0 1 2
}

Generator

Generator是一种特殊的函数,它可以暂停执行并返回一个值。要创建一个Generator,可以使用yield。yield关键字会暂停Generator的执行,并返回一个值。当Generator被调用时,它会从yield处继续执行。

function* myGenerator() {
  yield 0;
  yield 1;
  yield 2;
}

const generator = myGenerator();

console.log(generator.next()); // { value: 0, done: false }
console.log(generator.next()); // { value: 1, done: false }
console.log(generator.next()); // { value: 2, done: false }
console.log(generator.next()); // { value: undefined, done: true }

Symbol.iterator

Symbol.iterator是一个内置符号,它表示对象的默认迭代器。当一个对象被用作for of循环的迭代器时,会自动调用该对象的Symbol.iterator方法。如果对象没有实现Symbol.iterator方法,则会抛出一个错误。

const myObject = {
  [Symbol.iterator]: function*() {
    yield 0;
    yield 1;
    yield 2;
  }
};

for (const item of myObject) {
  console.log(item); // 0 1 2
}

骚操作之惊天大逆袭

了解了迭代器接口、Generator和Symbol.iterator之后,就可以开始骚操作了。

骚操作一:使用for of循环遍历数组

const arr = [0, 1, 2];

for (const item of arr) {
  console.log(item); // 0 1 2
}

骚操作二:使用for of循环遍历字符串

const str = 'hello';

for (const char of str) {
  console.log(char); // h e l l o
}

骚操作三:使用for of循环遍历Set

const set = new Set([0, 1, 2]);

for (const item of set) {
  console.log(item); // 0 1 2
}

骚操作四:使用for of循环遍历Map

const map = new Map([
  ['a', 0],
  ['b', 1],
  ['c', 2]
]);

for (const [key, value] of map) {
  console.log(key, value); // a 0 b 1 c 2
}

骚操作五:使用Generator创建斐波那契数列

function* fibonacci() {
  let [prev, curr] = [0, 1];
  while (true) {
    [prev, curr] = [curr, prev + curr];
    yield curr;
  }
}

const generator = fibonacci();

console.log(generator.next()); // { value: 1, done: false }
console.log(generator.next()); // { value: 1, done: false }
console.log(generator.next()); // { value: 2, done: false }
console.log(generator.next()); // { value: 3, done: false }
console.log(generator.next()); // { value: 5, done: false }

骚操作六:使用Symbol.iterator创建自定义迭代器

const myIterable = {
  [Symbol.iterator]: function*() {
    yield 0;
    yield 1;
    yield 2;
  }
};

for (const item of myIterable) {
  console.log(item); // 0 1 2
}

结束语

以上是JavaScript中遍历、枚举和迭代的骚操作。这些方法在工作中可能用不到,但可以帮助你装逼。不过,装逼多必翻车,请轻喷。