Symbol.iterator
**Symbol.iterator
** 静态数据属性表示众所周知的符号 Symbol.iterator
。该可迭代协议 为返回对象迭代器的该方法查找此符号。为了使对象可迭代,它必须具有一个 [Symbol.iterator]
键。
尝试一下
值
众所周知的符号 Symbol.iterator
。
Symbol.iterator 的属性属性 |
|
---|---|
可写 | 否 |
可枚举 | 否 |
可配置 | 否 |
描述
每当需要迭代对象时(例如在 for...of
循环开始时),其 [Symbol.iterator]()
方法将被调用,不带任何参数,并且返回的**迭代器**用于获取要迭代的值。
某些内置类型具有默认的迭代行为,而其他类型(例如Object
)则没有。一些具有 [Symbol.iterator]()
方法的内置类型是
Array.prototype[Symbol.iterator]()
TypedArray.prototype[Symbol.iterator]()
String.prototype[Symbol.iterator]()
Map.prototype[Symbol.iterator]()
Set.prototype[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 表格仅在浏览器中加载