继Angular学习笔记55:TypeScript基础–基本类型之后
现在来看看 iterator、generator和interface
iterator
当一个对象实现了Symbol.iterator的时候,就可以把这个对象认为是可迭代的。对象的Symbol.iterator函数负责返回迭代的值
常见的实现了Symbol.iterator的内置类型
- array
- map(ES6)
- string
- Set(ES6)
- int32Array
- uint32Array
在ES6中,内置对象Map和Set已经实现了Symbol.iterator方法,在ES5,ES3,迭代器只允许在array类型上使用,在非数组值上使用for…of语句会得到一个错误。
for…of 、 for…in
for…of 和 for…in 都可以迭代(遍历)一个数组,但是两者有很大的区别,for…of 迭代的是对象的值,for…in 迭代的是对象的键,也可以操作任何对象,提供了查看对象属性的一种方法。
const array = [7, 8, 9];
for(let i in array){
console.log(i); // 0, 1, 2
}
for(let i of array){
console.log(i); // 7, 8, 9
}
generator
function* 是用来创建 generator 函数的语法,调用 generator 函数时会返回一个 generator 对象。常用 next,return和throw函数。
generator 函数用于创建懒迭代器
function* initList() {
for (let i = 0; i < 3; i++) {
yield i++;
}
}
const initGenerator = initList();
console.log(initGenerator.next()); //{value: 0, done: false}
- 当直接调用generator函数时,并不会立即执行,只会创建一个generator对象
- generator 对象只会在调用 next 时才开始执行
- 函数在执行到 yield 语句
- 函数在next被调用时继续恢复执行
通过next传值
function* generatorInfo() {
const name = yield;
console.log('hello' + name);
}
const initGeneratorInfo = generatorInfo();
console.log(initGeneratorInfo.next()); // {value: undefined, done: false}
console.log(initGeneratorInfo.next('W先生'));
// helloW先生
// {value: undefined, done: true}
return 函数
function* generatorInfo() {
const name = yield;
console.log('hello' + name);
}
const initGeneratorInfo = generatorInfo();
console.log(initGeneratorInfo.return());
// {value: undefined, done: true}
console.log(initGeneratorInfo.return('W先生...'));
// {value: "W先生...", done: true}
throw 函数
generator 也可以捕获到error
function* generatorError() {
try {
yield 0;
} catch (e) {
console.log(e.message);
}
}
const initGeneratorError = generatorError();
console.log(initGeneratorError.next());
// {value: 0, done: false}
console.log(initGeneratorError.throw(new Error('发生错误')));
// 发生错误
// {value: undefined, done: true}
- generator 外部是可以传递一个值到 generator 函数体内
- generator 外部是可以抛入一个异常到 generator 函数体内