ES6中规定对象的Symbol.iterator属性指向该对象的默认迭代器方法,当对象进行for...of..遍历迭代时,会调用对象的Symbol.iterator方法,返回该对象的默认迭代器。...Symbol.iterator属性本身是一个函数,就是当前数据结构默认的迭代器生成函数。执行这个函数,就去返回一个迭代器。...至于属性名Symbol.iterator,它是一个表达式,返回Symbol对象的iterator属性,这是一个预定义好的、类型为 Symbol 的特殊值,所以要放在方括号内。...一个对象如果要具备可被for…of循环调用的 Iterator 接口,就必须在Symbol.iterator的属性上部署遍历器生成方法(原型链上的对象具有该方法也可)。...从ES6开始,从一个iterable中提取迭代器的方法是:iterable必须支持一个函数,其名称是专门的ES6符号值Symbol.iterator。调用这个函数时,它会返回一个迭代器。
迭代器 所谓迭代器,其实就是一个具有 next() 方法的对象,每次调用 next() 都会返回一个结果对象,该结果对象有两个属性,value 表示当前的值,done 表示遍历是否结束。...而且每个集合类型都有一个默认的迭代器,在 for-of 循环中,如果没有显式指定则使用默认的迭代器。...数组和 Set 集合的默认迭代器是 values() 方法,Map 集合的默认迭代器是 entries() 方法。...而之所以这么做,就要提到迭代器的 return 方法。 引用阮一峰老师的 ECMAScript 6 入门: 遍历器对象除了具有 next 方法,还可以具有 return 方法和 throw 方法。...如果你自己写遍历器对象生成函数,那么 next 方法是必须部署的,return 方法和 throw 方法是否部署是可选的。
symbol是ES6标准中新增的一种基本数据类型,symbol 的值是通过 Symbol()函数返回的,每一个 symbol 的值都是唯一的,即使传入相同的描述值。...那什么是迭代器呢?迭代器就是为实现对不同集合进行统一遍历操作的一种机制,在es6中有三类结构生来就具有Iterator属性:数组、类数组对象、Map和Set结构。...会返回一个对象,这个对象就是一个遍历器对象,而作为遍历器对象,其必须具备的特征就是必须具备next()方法。...Symbol.asyncIteratorSymbol.asyncIterator 符号用于标识一个异步迭代器,作用与 Symbol.iterator 相同,但产生的值期待为 Promise 实例,该异步迭代器被...和Symbol.iterator一样都会返回一个对象,一个遍历器对象,同样在Symbol.asyncIterator里也有有一个next()方法,不同的是Symbol.asyncIterator里面返回的
可以把可迭代对象理解成数组或集合这样的集合类型的对象,其包含的元素是有限的,而且都具有无歧义的遍历顺序。...默认迭代器属性必须引用一个迭代器工厂函数 调用上述工厂函数必须返回一个新迭代器 实现Iterator接口的内置类型 String Array Map Set arguments对象 NodeList...,那么这个对象也就实现了这个接口 # 迭代器协议 迭代器是一种一次性使用的对象,用于迭代与其关联的可迭代对象 迭代器API使用next()方法在可迭代对象中遍历数据 每次成功调用next(),都会返回一个...或throw提前退出 解构操作并未消费所有值 return()方法必须返回一个有效的IteratorResult对象 简单情况下,可以只返回 { done: true } 该返回值只会用在生成器的上下文中...)的状态 与迭代器相似,生成器对象也实现了Iterator接口,具有next()方法。
实际上,任何具有 Symbol.iterator 属性的元素都是可迭代的。我们可以简单查看几个可被for of迭代的对象,看看和普通对象有何不同: ? ? ?...而 iterator 的遍历过程,则是类似 Generator 的方式,迭代时不断调用next方法,返回一个包含value(值)和done属性(标识是否遍历结束)的对象。...; yield*:_yield*后面跟的是一个可遍历的结构,它会调用该结构的遍历器接口; 由于数组的遍历会调用遍历器接口,所以任何接受数组作为参数的场合,其实都调用; 字符串是一个类似数组的对象,也原生具有...迭代器模式 迭代器模式提供了一种方法顺序访问一个聚合对象中的各个元素,而又无需暴露该对象的内部实现,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。...迭代器模式为遍历不同的集合结构提供了一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。 不难发现,Symbol.iterator实现的就是一种迭代器模式。
一些内置类型都是内置的可迭代类型并且有默认的迭代行为, 比如 Array or Map, 另一些类型则不是 (比如Object) 。...为了变成可迭代对象, 一个对象必须实现 @@iterator 方法, 意思是这个对象(或者它原型链 prototype chain 上的某个对象)必须有一个名字是 Symbol.iterator 的属性...说的云山雾罩的,简单总结: 1、迭代器就是满足迭代器协议的对象 2、迭代器对象的原型上必须有一个@@iterator 方法。 3、这个方法可以被对象上的Symbol.iterator属性访问到。...4、被迭代时,@@iterator方法被调用并且无参数,返回一个迭代器,这个迭代器上有一个next方法 5、next方法执行会便利其属性,返回一个对象对象属性有value,done为false一直遍历,...5、能被for of 循环的就是迭代器。 可迭代对象的必须存在[Symbol.iterator]方法,该方法一个无参函数,返回迭代器协议的对象。
我们将在本文中分析迭代器。迭代器是在JavaScript中循环任何集合的一种新方法。它们是在ES6中引入的,由于它们的广泛用途和在不同地方的使用而变得非常流行。...Rowling'}, ... ] 开发人员必须知道返回所有数据的方法的确切名称和返回类型。 如果我们规定方法的名称和它的返回类型是固定不变的呢?...同时,Symbol.iterator 返回一个名为迭代器的对象,这个迭代器将拥有一个名为next的方法,该方法将返回一个具有键值为 value 和 done 的对象。...根据Axel Rauschmayer博士的《探索JS》一书: 可迭代是一种数据结构,它希望使其元素对外部可访问,通过实现一个关键字是Symbol.iterator的方法来实现,该方法是迭代器的工厂,也就是说...的方法 在第4行,我们创建迭代器。
Rowling'}, ... ] 开发人员必须知道返回所有数据的方法的确切名称和返回类型。 如果我们规定方法的名称和它的返回类型是固定不变的呢?...同时,Symbol.iterator 返回一个名为迭代器的对象,这个迭代器将拥有一个名为next的方法,该方法将返回一个具有键值为 value 和 done 的对象。...值键 value 包含当前值,它可以是任何类型的,done 是布尔值,它表示是否获取了所有的值。 下图可以帮助建立可迭代对象、迭代器和next之间的关系,这种关系称为迭代协议。...image.png 根据Axel Rauschmayer博士的《探索JS》一书: 可迭代是一种数据结构,它希望使其元素对外部可访问,通过实现一个关键字是Symbol.iterator的方法来实现,该方法是迭代器的工厂...的方法 image.png 在第4行,我们创建迭代器。
在 ECMAScript 中,这意味着必须暴露一个属性作为“默认迭代器”,而且这个属性必须使用特殊的 Symbol.iterator 作为键。...这个默认迭代器属性必须引用一个迭代器工厂函数,调用这个工厂函数必须返回一个新迭代器。...next()方法返回的迭代器对象 IteratorResult 包含两个属性:done 和 value。...提前终止迭代器 一般我们用return()方法来关闭执行迭代的逻辑。...return方法必须返回一个返回值,我们可以只返回 done:true let a = [1, 2, 3, 4, 5]; let iter = a[Symbol.iterator
手写实现可迭代对象 一个数据结构只要具有 Symbol.iterator 属性,就可以认为是“可遍历的”。...Symbol.iterator 属性本身是一个函数,就是当前数据结构默认的遍历器生成函数,执行这个函数,就会返回一个迭代器对象。...方法,并能够执行返回迭代器对象,同时验证了for...of循环成功执行 let arr = [1, 2, 3] let it = arr[Symbol.iterator]()//返回迭代器对象 console.log...需要特别注意的是,return 方法必须有一个 object 类型的返回值 我们在前面代码的基础上添加上 return 方法,并在 for...of 循环中采用 break 语句来中断循环,循环提前退出...而 for...of 执行的时候会自动调用迭代器来取值 只有实现了 Iterator 接口的对象才能采用 for...of 迭代器是一个返回迭代器对象的方法 ES6 中很多场景都采用了 Iterator
从以前的for循环到之后的filter、map再到后来的for…in和for…of的迭代机制。只要具有iterator接口的都可被迭代。...2、迭代器 Iterator 2.1 含义 迭代器(iterator)为各种数据结构,提供一个统一的、简便的访问接口,简单的说,迭代可以是数组或对象的遍历方式。...常见的具有这一特点的数据结构有:Array、Map、Set、String、TypedArray(类型化的数组)、函数的 arguments 对象、NodeList 对象 2.3.2 示例1:数组的iterator...2.3.3 对象的Iterator 一个对象如果要具备可被for…of循环调用的 Iterator 接口,就必须在Symbol.iterator的属性上部署遍历器生成方法(原型链上的对象具有该方法也可)...3.2 工作过程 遍历器对象的next方法的运行逻辑: 遇到yield表达式,就暂停执行后面的操作,并将紧跟在yield后面的那个表达式的值,作为返回的对象的value属性值。
一、Iterator(遍历器)的存在 1、迭代器模式 迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。...以上数据类型,都有 Symbol.iterator 属性,属性值是一个函数,执行这个函数就会返回一个迭代器。这个迭代器就有 next 方法可顺序迭代子元素。...遍历器对象的根本特征就是具有 next 方法。 每次调用 next 方法,都会返回一个代表当前成员的信息对象,具有 value 和 done 两个属性。...另外,for...of 循环调用遍历器接口,数组的遍历器接口只返回具有数字索引的属性。这一点跟 for...in 循环不一样。...Iterator 接口,就必须在Symbol.iterator 的属性上部署遍历器生成方法(原型链上的对象具有该方法也可)。
Symbol.iterator 支持的数据结构 ES6 中提供了 Symbol.iterator 方法,该方法返回一个迭代器对象,目前 Array、Set、Map 这些数据结构默认具有 Symbol.iterator...next 方法 调用可迭代对象的 Symbol.iterator 方法会返回一个迭代器对象,它的接口中有一个 next 方法,该方法返回 value 和 done 两个属性,其中 value 属性是当前成员的值...注意 Map 调用 Symbol.iterator 方法返回的是一个 entries 方法,该方法返回的是一个新的迭代器对象且按插入顺序包含了 Map 对象中每个元素的 [key, value] 数组,...所以调用 Map 实例的 keys 或 values 方法也会返回一个新的迭代器对象。...根据迭代器协议定义这个迭代器对象要返回一个 next() 方法,这个 next() 方法返回一个包含 value、done 属性的对象。
这个方法必须返回一个 迭代器(iterator) —— 一个有 next 方法的对象。 从此开始,for..of 仅适用于这个被返回的对象。...next() 方法返回的结果的格式必须是 {done: Boolean, value: any},当 done=true 时,表示迭代结束,否则 value 是下一个值。...技术上来说,可迭代对象必须实现 Symbol.iterator 方法。 obj[Symbol.iterator]() 的结果被称为 迭代器(iterator)。由它处理进一步的迭代过程。...一个迭代器必须有 next() 方法,它返回一个 {done: Boolean, value: any} 对象,这里 done:true 表明迭代结束,否则 value 就是下一个值。...这种对象可能还具有其他属性和方法,但是没有数组的内建方法。
迭代器对象是一个特殊的接口,所有迭代器对象都有一个next()方法,每次调用都返回一个结果对象。...结果对象有两个属性:一个是value表示下一次返回的值,另一个是Boolean类型的值done,当没有更多可返回的数据时返回true。迭代器对象内部本质其实就是存在一个指针,用来指向集合中值的位置。...为了变成可迭代对象, 一个对象必须实现 @@iterator 方法, 意思是这个对象(或者它原型链 prototype chain 上的某个对象)必须有一个名字是 Symbol.iterator 的属性...自定义可迭代 满足可迭代协议。 存在[Symbol.iterator]属性。 满足迭代器协议。 [Symbol.iterator]属性要求返回一个可迭代的对象。...(详情参照Demo) 自行实现需要[Symbol.iterator]方法返回一个对象,其实迭代器可以看作就是一个对象,这个对象存在一个next方法。
领取专属 10元无门槛券
手把手带您无忧上云