首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

《你不知道的JavaScript》:迭代器Iterator的背景梳理

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。调用这个函数时,它会返回一个迭代器。

1.5K10

迭代器与 for of的使用和原理

迭代器 所谓迭代器,其实就是一个具有 next() 方法的对象,每次调用 next() 都会返回一个结果对象,该结果对象有两个属性,value 表示当前的值,done 表示遍历是否结束。...而且每个集合类型都有一个默认的迭代器,在 for-of 循环中,如果没有显式指定则使用默认的迭代器。...数组和 Set 集合的默认迭代器是 values() 方法,Map 集合的默认迭代器是 entries() 方法。...而之所以这么做,就要提到迭代器的 return 方法。 引用阮一峰老师的 ECMAScript 6 入门: 遍历器对象除了具有 next 方法,还可以具有 return 方法和 throw 方法。...如果你自己写遍历器对象生成函数,那么 next 方法是必须部署的,return 方法和 throw 方法是否部署是可选的。

1.5K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【JS】230-迭代器与 for of的使用和原理

    迭代器 所谓迭代器,其实就是一个具有 next() 方法的对象,每次调用 next() 都会返回一个结果对象,该结果对象有两个属性,value 表示当前的值,done 表示遍历是否结束。...而且每个集合类型都有一个默认的迭代器,在 for-of 循环中,如果没有显式指定则使用默认的迭代器。...数组和 Set 集合的默认迭代器是 values() 方法,Map 集合的默认迭代器是 entries() 方法。...而之所以这么做,就要提到迭代器的 return 方法。 引用阮一峰老师的 ECMAScript 6 入门: 遍历器对象除了具有 next 方法,还可以具有 return 方法和 throw 方法。...如果你自己写遍历器对象生成函数,那么 next 方法是必须部署的,return 方法和 throw 方法是否部署是可选的。

    90141

    ES6 系列之迭代器与 for of

    迭代器 所谓迭代器,其实就是一个具有 next() 方法的对象,每次调用 next() 都会返回一个结果对象,该结果对象有两个属性,value 表示当前的值,done 表示遍历是否结束。...而且每个集合类型都有一个默认的迭代器,在 for-of 循环中,如果没有显式指定则使用默认的迭代器。...数组和 Set 集合的默认迭代器是 values() 方法,Map 集合的默认迭代器是 entries() 方法。...而之所以这么做,就要提到迭代器的 return 方法。 引用阮一峰老师的 ECMAScript 6 入门: 遍历器对象除了具有 next 方法,还可以具有 return 方法和 throw 方法。...如果你自己写遍历器对象生成函数,那么 next 方法是必须部署的,return 方法和 throw 方法是否部署是可选的。

    49910

    Symbol.iterator和Symbol.asyncIterator

    symbol是ES6标准中新增的一种基本数据类型,symbol 的值是通过 Symbol()函数返回的,每一个 symbol 的值都是唯一的,即使传入相同的描述值。...那什么是迭代器呢?迭代器就是为实现对不同集合进行统一遍历操作的一种机制,在es6中有三类结构生来就具有Iterator属性:数组、类数组对象、Map和Set结构。...会返回一个对象,这个对象就是一个遍历器对象,而作为遍历器对象,其必须具备的特征就是必须具备next()方法。...Symbol.asyncIteratorSymbol.asyncIterator 符号用于标识一个异步迭代器,作用与 Symbol.iterator 相同,但产生的值期待为 Promise 实例,该异步迭代器被...和Symbol.iterator一样都会返回一个对象,一个遍历器对象,同样在Symbol.asyncIterator里也有有一个next()方法,不同的是Symbol.asyncIterator里面返回的

    18520

    JavaScript 高级程序设计(第 4 版)- 迭代器与生成器

    可以把可迭代对象理解成数组或集合这样的集合类型的对象,其包含的元素是有限的,而且都具有无歧义的遍历顺序。...默认迭代器属性必须引用一个迭代器工厂函数 调用上述工厂函数必须返回一个新迭代器 实现Iterator接口的内置类型 String Array Map Set arguments对象 NodeList...,那么这个对象也就实现了这个接口 # 迭代器协议 迭代器是一种一次性使用的对象,用于迭代与其关联的可迭代对象 迭代器API使用next()方法在可迭代对象中遍历数据 每次成功调用next(),都会返回一个...或throw提前退出 解构操作并未消费所有值 return()方法必须返回一个有效的IteratorResult对象 简单情况下,可以只返回 { done: true } 该返回值只会用在生成器的上下文中...)的状态 与迭代器相似,生成器对象也实现了Iterator接口,具有next()方法。

    60450

    可以迭代大部分数据类型的 for…of 为什么不能遍历普通对象?

    实际上,任何具有 Symbol.iterator 属性的元素都是可迭代的。我们可以简单查看几个可被for of迭代的对象,看看和普通对象有何不同: ? ? ?...而 iterator 的遍历过程,则是类似 Generator 的方式,迭代时不断调用next方法,返回一个包含value(值)和done属性(标识是否遍历结束)的对象。...; yield*:_yield*后面跟的是一个可遍历的结构,它会调用该结构的遍历器接口; 由于数组的遍历会调用遍历器接口,所以任何接受数组作为参数的场合,其实都调用; 字符串是一个类似数组的对象,也原生具有...迭代器模式 迭代器模式提供了一种方法顺序访问一个聚合对象中的各个元素,而又无需暴露该对象的内部实现,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。...迭代器模式为遍历不同的集合结构提供了一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。 不难发现,Symbol.iterator实现的就是一种迭代器模式。

    1.2K30

    揭秘ES6的迭代器

    一些内置类型都是内置的可迭代类型并且有默认的迭代行为, 比如 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]方法,该方法一个无参函数,返回迭代器协议的对象。

    40851

    ES6迭代器的简单指南和示例

    我们将在本文中分析迭代器。迭代器是在JavaScript中循环任何集合的一种新方法。它们是在ES6中引入的,由于它们的广泛用途和在不同地方的使用而变得非常流行。...Rowling'}, ... ] 开发人员必须知道返回所有数据的方法的确切名称和返回类型。 如果我们规定方法的名称和它的返回类型是固定不变的呢?...同时,Symbol.iterator 返回一个名为迭代器的对象,这个迭代器将拥有一个名为next的方法,该方法将返回一个具有键值为 value 和 done 的对象。...根据Axel Rauschmayer博士的《探索JS》一书: 可迭代是一种数据结构,它希望使其元素对外部可访问,通过实现一个关键字是Symbol.iterator的方法来实现,该方法是迭代器的工厂,也就是说...的方法 在第4行,我们创建迭代器。

    1.5K40

    新手都能看得懂的 ES6 Iterators

    Rowling'}, ... ] 开发人员必须知道返回所有数据的方法的确切名称和返回类型。 如果我们规定方法的名称和它的返回类型是固定不变的呢?...同时,Symbol.iterator 返回一个名为迭代器的对象,这个迭代器将拥有一个名为next的方法,该方法将返回一个具有键值为 value 和 done 的对象。...值键 value 包含当前值,它可以是任何类型的,done 是布尔值,它表示是否获取了所有的值。 下图可以帮助建立可迭代对象、迭代器和next之间的关系,这种关系称为迭代协议。...image.png 根据Axel Rauschmayer博士的《探索JS》一书: 可迭代是一种数据结构,它希望使其元素对外部可访问,通过实现一个关键字是Symbol.iterator的方法来实现,该方法是迭代器的工厂...的方法 image.png 在第4行,我们创建迭代器。

    54420

    【深扒】 JavaScript 中的迭代器

    手写实现可迭代对象 一个数据结构只要具有 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

    53520

    ES6 学习笔记(十一)迭代器和生成器函数

    从以前的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属性值。

    23420

    ES6中的Iterator 和for of循环

    一、Iterator(遍历器)的存在 1、迭代器模式 迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。...以上数据类型,都有 Symbol.iterator 属性,属性值是一个函数,执行这个函数就会返回一个迭代器。这个迭代器就有 next 方法可顺序迭代子元素。...遍历器对象的根本特征就是具有 next 方法。 每次调用 next 方法,都会返回一个代表当前成员的信息对象,具有 value 和 done 两个属性。...另外,for...of 循环调用遍历器接口,数组的遍历器接口只返回具有数字索引的属性。这一点跟 for...in 循环不一样。...Iterator 接口,就必须在Symbol.iterator 的属性上部署遍历器生成方法(原型链上的对象具有该方法也可)。

    82720

    从理解到实现轻松掌握 ES6 中的迭代器

    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 属性的对象。

    46210

    【云+社区年度征文】再看JavaScript,那些遗漏或易混淆的知识点(2)

    这个方法必须返回一个 迭代器(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 就是下一个值。...这种对象可能还具有其他属性和方法,但是没有数组的内建方法。

    79600

    再看JavaScript,那些遗漏或易混淆的知识点(2)

    这个方法必须返回一个 迭代器(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 就是下一个值。...这种对象可能还具有其他属性和方法,但是没有数组的内建方法。

    92510

    ES6之Iterator

    迭代器对象是一个特殊的接口,所有迭代器对象都有一个next()方法,每次调用都返回一个结果对象。...结果对象有两个属性:一个是value表示下一次返回的值,另一个是Boolean类型的值done,当没有更多可返回的数据时返回true。迭代器对象内部本质其实就是存在一个指针,用来指向集合中值的位置。...为了变成可迭代对象, 一个对象必须实现 @@iterator 方法, 意思是这个对象(或者它原型链 prototype chain 上的某个对象)必须有一个名字是 Symbol.iterator 的属性...自定义可迭代 满足可迭代协议。 存在[Symbol.iterator]属性。 满足迭代器协议。 [Symbol.iterator]属性要求返回一个可迭代的对象。...(详情参照Demo) 自行实现需要[Symbol.iterator]方法返回一个对象,其实迭代器可以看作就是一个对象,这个对象存在一个next方法。

    21820

    ES6:【深扒】 JavaScript 中的迭代器

    手写实现可迭代对象 一个数据结构只要具有 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

    38330

    【深扒】 JavaScript 中的迭代器

    手写实现可迭代对象 一个数据结构只要具有 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

    51431
    领券