在线文档教程

Symbol.iterator

Symbol.iterator

Symbol.iterator公知的符号指定为对象的默认迭代器。使用for...of

| Symbol.iterator 属性的属性特性:|

|:----|

| Writable | no |

| Enumerable | no |

| Configurable | no |

描述

当需要对一个对象进行迭代时(比如开始用于一个for..of循环中),它的@@iterator方法都会在不传参情况下被调用,返回的迭代器用于获取要迭代的值。

一些内置类型拥有默认的迭代器行为,其他类型(如Object)则没有。下表中的内置类型拥有默认的@@iterator方法:

  • Array.prototype[@@iterator]()

  • TypedArray.prototype[@@iterator]()

  • String.prototype[@@iterator]()

  • Map.prototype[@@iterator]()

  • Set.prototype[@@iterator]()

更多信息请参见迭代协议

示例

自定义迭代器

我们可以像下面这样创建自定义的迭代器:

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

不符合标准的迭代器

如果一个迭代器 @@iterator 没有返回一个迭代器对象,那么它就是一个不符合标准的迭代器,这样的迭代器将会在运行期抛出异常,甚至非常诡异的 Bug。

var nonWellFormedIterable = {} nonWellFormedIterable[Symbol.iterator] = () => 1 [...nonWellFormedIterable] // TypeError: [] is not a function

规范

SpecificationStatusComment
ECMAScript 2015 (6th Edition, ECMA-262)The definition of 'Symbol.iterator' in that specification.StandardInitial definition.
ECMAScript Latest Draft (ECMA-262)The definition of 'Symbol.iterator' in that specification.Living Standard

浏览器兼容性

FeatureChromeEdgeFirefox (Gecko)Internet ExplorerOperaSafari
Basic support43(Yes)36 (36)No support3010

FeatureAndroidChrome for AndroidEdgeFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Basic supportNo supportNo support(Yes)36.0 (36)No supportNo supportNo support