这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战
接上一篇:TypeScript实例讲解(十六)
本篇内容:迭代器。
迭代器
JavaScript 提供了许多迭代集合的方法,从简单的 for 循环到 map() 和 filter()。
当一个对象实现了 Symbol.iterator 属性时,我们认为它是可迭代的。 一些内置的类型如 Array,Map,Set,String,Int32Array,Uint32Array 等都已经实现了各自的 Symbol.iterator。 对象上的 Symbol.iterator 函数负责返回供迭代的值。(来源于 TypeScript 官方文档)
Symbol.iterator 属性本身是一个函数,就是当前数据结构默认的迭代器生成函数。执行这个函数,就会返回一个迭代器。
// 例 1
// 定义一个变量
let name = 'bear'
// 返回一个迭代器
let iterator = name[Symbol.iterator]()
// 打印
console.log(iterator.next()) // {value: 'b', done: false}
console.log(iterator.next()) // {value: 'e', done: false}
console.log(iterator.next()) // {value: 'a', done: false}
console.log(iterator.next()) // {value: 'r', done: false}
String 是一个内置的可迭代对象,String 的默认迭代器会依次返回当前字符串的字符。如例1中的字符串变量 bear 最后返回了 b、e、a 和 r。
// 例 2 (接例 1)
console.log(iterator.next()) // { value: undefined, done: true }
在例1的基础上继续调用 next() 方法,则不再返回 value 值。
for of 和 for in
// 例 1
// 演示列表
const list = [10, 20, 30];
// for of 语句
for (let i of list) {
console.log(i); // 10, 20, 30
}
// for in 语句
for (let i in list) {
console.log(i); // "0", "1", "2",
}
for of 和 for in 都可以迭代列表,但是用于迭代的值却不同: for of 迭代对象的键对应的值,而 for in 则迭代的是对象的键的列表。
// 例 2
const list = [10, 20, 30];
for (let i of list) {
console.log(i);
console.log(typeof i); // number, number, number
}
为什么官方文档上一个 number 类型的数组通过 for of 迭代出来的值变成了 string 类型?楼主打印出来还是 number 类型,应该是官方文档写错了吧。
迭代器的作用
1、为各种数据结构,提供一个统一的、简便的访问接口。
2、使得数据结构的成员能够按某种次序排列。
3、创造了一种新的遍历命令 for of 循环。
for of 会遍历可迭代的对象(如 Array,Map,Set,String,TypedArray,arguments 对象等),调用对象上的 Symbol.iterator 方法。
本篇完!如果文章对你有一点点帮助,请记得点个赞哦。