TypeScript实例讲解(十七)

290 阅读2分钟

这是我参与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 offor 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 offor 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 方法。

本篇完!如果文章对你有一点点帮助,请记得点个赞哦。