Symbol.iterator

**Symbol.iterator** 静态数据属性表示众所周知的符号 Symbol.iterator。该可迭代协议 为返回对象迭代器的该方法查找此符号。为了使对象可迭代,它必须具有一个 [Symbol.iterator] 键。

尝试一下

众所周知的符号 Symbol.iterator

Symbol.iterator 的属性属性
可写
可枚举
可配置

描述

每当需要迭代对象时(例如在 for...of 循环开始时),其 [Symbol.iterator]() 方法将被调用,不带任何参数,并且返回的**迭代器**用于获取要迭代的值。

某些内置类型具有默认的迭代行为,而其他类型(例如Object)则没有。一些具有 [Symbol.iterator]() 方法的内置类型是

有关更多信息,请参阅迭代协议

示例

用户定义的可迭代对象

我们可以像这样制作我们自己的可迭代对象

js
const myIterable = {};
myIterable[Symbol.iterator] = function* () {
  yield 1;
  yield 2;
  yield 3;
};
[...myIterable]; // [1, 2, 3]

或者可迭代对象可以使用计算属性 直接在类或对象中定义。

js
class Foo {
  *[Symbol.iterator]() {
    yield 1;
    yield 2;
    yield 3;
  }
}

const someObj = {
  *[Symbol.iterator]() {
    yield "a";
    yield "b";
  },
};

console.log(...new Foo()); // 1, 2, 3
console.log(...someObj); // 'a', 'b'

非格式良好的可迭代对象

如果可迭代对象的 [Symbol.iterator]() 方法没有返回迭代器对象,那么它就是一个非格式良好的可迭代对象。像这样使用它很可能导致运行时异常或错误行为。

js
const nonWellFormedIterable = {};
nonWellFormedIterable[Symbol.iterator] = () => 1;
[...nonWellFormedIterable]; // TypeError: [Symbol.iterator]() returned a non-object value

规范

规范
ECMAScript 语言规范
# sec-symbol.iterator

浏览器兼容性

BCD 表格仅在浏览器中加载

另请参阅