Symbol.iterator 是 ES6 引入的一种新类型,表示一个对象所具有的默认迭代器函数,可以用于自定义迭代器的实现。一个实现Symbol.iterator 接口的对象,可以使用 for..of 循环遍历其中的元素。
以下是几个使用 Symbol.iterator 的例子:
- 对数组进行迭代:
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();
}
- 对对象进行迭代:
因为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);
}
- 对字符串进行迭代:
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 循环遍历。