Symbol.iterator的作用

224 阅读1分钟

Symbol.iterator 是 ES6 引入的一种新类型,表示一个对象所具有的默认迭代器函数,可以用于自定义迭代器的实现。一个实现Symbol.iterator 接口的对象,可以使用 for..of 循环遍历其中的元素。

以下是几个使用 Symbol.iterator 的例子:

  1. 对数组进行迭代:
const arr = [1, 2, 3, 4];
const iterator = arr[Symbol.iterator]();
let result = iterator.next();
while (!result.done) {
  console.log(result.value);
  result = iterator.next();
}
  1. 对对象进行迭代:

因为for of只能遍历可迭代对象,而对象并不是可迭代对象。可迭代对象必须实现一个名为Symbol.iterator的内置方法,该方法返回一个迭代器对象,而对象并没有实现该方法。相反,对象可以通过for in语句进行迭代,并遍历它们的键值对。

const obj = {
  name: 'Tom',
  age: 18,
  gender: 'male',
  [Symbol.iterator]: function() {
    const keys = Object.keys(this);
    let i = 0;
    return {
      next: function() {
        if (i < keys.length) {
          const key = keys[i++];
          return { value: this[key], done: false };
        } else {
          return { done: true };
        }
      }.bind(this)
    }
  }
};

// 或者
obj.__proto__[Symbol.iterator] = function * objectIterator() {
  for (let key in this) {
    if (obj.hasOwnProperty(key)) {
      yield [key, this[key]]
    }
  }
}

// 可以使用 for..of 循环遍历
for (const value of obj) {
  console.log(value);
}
  1. 对字符串进行迭代:
const str = 'hello';
const iterator = str[Symbol.iterator]();
let result = iterator.next();
while (!result.done) {
  console.log(result.value);
  result = iterator.next();
}

总之,Symbol.iterator 是一个非常有用的 API,可以方便地实现自定义的可迭代对象,并使其支持 for..of 循环遍历。