TypeScript 教程
- 第1节:TypeScript 快速入门
- 第2节:TypeScript 2.0介绍
- 第3节:TypeScript 2.1介绍
- 第4节:TypeScript 3.1介绍
- 第5节:TypeScript 基础类型
- 第6节:TypeScript 变量声明
- 第7节:TypeScript 接口
- 第8节:TypeScript 类
- 第9节:TypeScript 函数
- 第10节:TypeScript 泛型
- 第11节:TypeScript 枚举
- 第12节:TypeScript 类型推论
- 第13节:TypeScript 类型兼容性
- 第14节:TypeScript 高级类型
- 第15节:TypeScript Symbols
- 第16节:TypeScript 迭代器和生成器
- 第17节:TypeScript 模块
- 第18节:TypeScript 命名空间
- 第19节:TypeScript 命名空间和模块
- 第20节:TypeScript 模块解析
- 第21节:TypeScript 声明合并
- 第22节:TypeScript JSX
- 第23节:TypeScript 装饰器
- 第24节:TypeScript Mixins
- 第25节:TypeScript 三斜线指令
- 第26节:TypeScript 声明文件结构
- 第27节:TypeScript 声明文件举例
- 第28节:TypeScript 声明文件规范
- 第29节:TypeScript 声明文件原理
- 第30节:TypeScript 声明文件模板
- 第31节:TypeScript 声明文件发布
- 第32节:TypeScript 声明文件使用
- 第33节:TypeScript tsconfig.json
- 第34节:TypeScript 编译选项
- 第35节:TypeScript MSBuild编译选项
- 第36节:TypeScript 构建工具整合
- 第37节:TypeScript 每日构建
TypeScript 迭代器和生成器
可迭代性
当一个对象实现了Symbol.iterator
属性时,我们认为它是可迭代的。 一些内置的类型如Array
,Map
,Set
,String
,Int32Array
,Uint32Array
等都已经实现了各自的Symbol.iterator
。 对象上的 Symbol.iterator
函数负责返回供迭代的值。
for..of
语句
for..of
会遍历可迭代的对象,调用对象上的Symbol.iterator
方法。 下面是在数组上使用 for..of
的简单例子:
let someArray = [1, "string", false];
for (let entry of someArray) {
console.log(entry); // 1, "string", false
}
for..of
vs. for..in
语句
for..of
和for..in
均可迭代一个列表;但是用于迭代的值却不同,for..in
迭代的是对象的 键 的列表,而for..of
则迭代对象的键对应的值。
下面的例子展示了两者之间的区别:
let list = [4, 5, 6];
for (let i in list) {
console.log(i); // "0", "1", "2",
}
for (let i of list) {
console.log(i); // "4", "5", "6"
}
另一个区别是for..in
可以操作任何对象;它提供了查看对象属性的一种方法。 但是 for..of
关注于迭代对象的值。内置对象Map
和Set
已经实现了Symbol.iterator
方法,让我们可以访问它们保存的值。
let pets = new Set(["Cat", "Dog", "Hamster"]);
pets["species"] = "mammals";
for (let pet in pets) {
console.log(pet); // "species"
}
for (let pet of pets) {
console.log(pet); // "Cat", "Dog", "Hamster"
}
代码生成
目标为 ES5 和 ES3
当生成目标为ES5或ES3,迭代器只允许在Array
类型上使用。 在非数组值上使用 for..of
语句会得到一个错误,就算这些非数组值已经实现了Symbol.iterator
属性。
编译器会生成一个简单的for
循环做为for..of
循环,比如:
let numbers = [1, 2, 3];
for (let num of numbers) {
console.log(num);
}
生成的代码为:
var numbers = [1, 2, 3];
for (var _i = 0; _i < numbers.length; _i++) {
var num = numbers[_i];
console.log(num);
}
目标为 ECMAScript 2015 或更高
当目标为兼容ECMAScipt 2015的引擎时,编译器会生成相应引擎的for..of
内置迭代器实现方式。