
- ES6 教程
- ES6 - 首页
- ES6 - 概述
- ES6 - 环境
- ES6 - 语法
- ES6 - 变量
- ES6 - 运算符
- ES6 - 决策
- ES6 - 循环
- ES6 - 函数
- ES6 - 事件
- ES6 - Cookies
- ES6 - 页面重定向
- ES6 - 对话框
- ES6 - Void 关键字
- ES6 - 页面打印
- ES6 - 对象
- ES6 - 数字
- ES6 - 布尔值
- ES6 - 字符串
- ES6 - Symbol
- ES6 - 新的字符串方法
- ES6 - 数组
- ES6 - 日期
- ES6 - 数学
- ES6 - 正则表达式
- ES6 - HTML DOM
- ES6 - 迭代器
- ES6 - 集合
- ES6 - 类
- ES6 - Map 和 Set
- ES6 - Promise
- ES6 - 模块
- ES6 - 错误处理
- ES6 - 对象扩展
- ES6 - Reflect API
- ES6 - Proxy API
- ES6 - 验证
- ES6 - 动画
- ES6 - 多媒体
- ES6 - 调试
- ES6 - 图像地图
- ES6 - 浏览器
- ES7 - 新特性
- ES8 - 新特性
- ES9 - 新特性
- ES6 有用资源
- ES6 - 快速指南
- ES6 - 有用资源
- ES6 - 讨论
ES6 - 迭代器
迭代器介绍
迭代器是一个对象,它允许我们一次访问一个对象的集合。
以下内置类型默认情况下是可迭代的 -
- 字符串
- 数组
- Map
- Set
如果一个对象实现了一个键为[Symbol.iterator]并返回迭代器的函数,则该对象被认为是可迭代的。可以使用 for...of 循环来迭代集合。
示例
以下示例声明一个数组 marks,并使用for..of循环遍历它。
<script> let marks = [10,20,30] //check iterable using for..of for(let m of marks){ console.log(m); } </script>
以上代码的输出将如下所示 -
10 20 30
示例
以下示例声明一个数组 marks 并检索一个迭代器对象。[Symbol.iterator]()可用于检索迭代器对象。迭代器的 next() 方法返回一个包含'value'和'done'属性的对象。'done' 是布尔值,在读取集合中的所有项目后返回 true。
<script> let marks = [10,20,30] let iter = marks[Symbol.iterator](); console.log(iter.next()) console.log(iter.next()) console.log(iter.next()) console.log(iter.next()) </script>
以上代码的输出将如下所示 -
{value: 10, done: false} {value: 20, done: false} {value: 30, done: false} {value: undefined, done: true}
自定义可迭代对象
JavaScript 中的某些类型是可迭代的(例如 Array、Map 等),而其他类型则不是(例如 Class)。默认情况下不可迭代的 JavaScript 类型可以通过使用可迭代协议进行迭代。
以下示例定义了一个名为CustomerList的类,它将多个客户对象存储为一个数组。每个客户对象都具有 firstName 和 lastName 属性。
为了使此类可迭代,该类必须实现[Symbol.iterator]()函数。此函数返回一个迭代器对象。迭代器对象有一个函数next,它返回一个对象{value:'customer',done:true/false}。
<script> //user defined iterable class CustomerList { constructor(customers){ //adding customer objects to an array this.customers = [].concat(customers) } //implement iterator function [Symbol.iterator](){ let count=0; let customers = this.customers return { next:function(){ //retrieving a customer object from the array let customerVal = customers[count]; count+=1; if(count<=customers.length){ return { value:customerVal, done:false } } //return true if all customer objects are iterated return {done:true} } } } } //create customer objects let c1={ firstName:'Sachin', lastName:'Tendulkar' } let c2={ firstName:'Rahul', lastName:'Dravid' } //define a customer array and initialize it let customers=[c1,c2] //pass customers to the class' constructor let customersObj = new CustomerList(customers); //iterating using for..of for(let c of customersObj){ console.log(c) } //iterating using the next() method let iter = customersObj[Symbol.iterator](); console.log(iter.next()) console.log(iter.next()) console.log(iter.next()) </script>
以上代码的输出如下所示 -
{firstName: "Sachin", lastName: "Tendulkar"} {firstName: "Rahul", lastName: "Dravid"} { done: false value: { firstName: "Sachin", lastName: "Tendulkar" } } { done: false value: { firstName: "Rahul", lastName: "Dravid" } } {done: true}
Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.
生成器
在 ES6 之前,JavaScript 中的函数遵循运行至完成模型。ES6 引入了称为生成器的函数,这些函数可以在中途停止,然后从停止的地方继续。
生成器在函数名前缀一个星号 * 字符,并包含一个或多个yield语句。yield关键字返回一个迭代器对象。
语法
function * generator_name() { yield value1 ... yield valueN }
示例
该示例定义了一个生成器函数getMarks,其中包含三个 yield 语句。与普通函数不同,生成器函数 getMarks()在调用时不会执行函数,而是返回一个迭代器对象,该对象可帮助您执行生成器函数内的代码。
在第一次调用markIter.next()时,开头的操作将运行,并且 yield 语句会暂停生成器的执行。后续对markIter.next()的调用将恢复生成器函数,直到下一个yield表达式。
<script> //define generator function function * getMarks(){ console.log("Step 1") yield 10 console.log("Step 2") yield 20 console.log("Step 3") yield 30 console.log("End of function") } //return an iterator object let markIter = getMarks() //invoke statements until first yield console.log(markIter.next()) //resume execution after the last yield until second yield expression console.log(markIter.next()) //resume execution after last yield until third yield expression console.log(markIter.next()) console.log(markIter.next()) // iteration is completed;no value is returned </script>
以上代码的输出将如下所示 -
Step 1 {value: 10, done: false} Step 2 {value: 20, done: false} Step 3 {value: 30, done: false} End of function {value: undefined, done: true}
示例
以下示例通过
* evenNumberGenerator 生成器函数创建了一个无限的偶数序列。
我们可以使用next()或使用for of循环遍历所有偶数,如下所示
<script> function * evenNumberGenerator(){ let num = 0; while(true){ num+=2 yield num } } // display first two elements let iter = evenNumberGenerator(); console.log(iter.next()) console.log(iter.next()) //using for of to iterate till 12 for(let n of evenNumberGenerator()){ if(n==12)break; console.log(n); } </script>
以上代码的输出如下所示 -
{value: 2, done: false} {value: 4, done: false} 2 4 6 8 10