Generator(如何让遍历“停”下来)
通俗的讲,Generators是可以用来控制迭代器的函数。
ES6支持这功能,应用场景:一个个抽奖
1 | loop() |
语法
1、比普通函数多一个 *
2、函数内部用yield来控制程序的执行的“暂停”
3、函数的返回值通过调用next来恢复程序的执行
1 | function * gen () { |
循环中间传参
1 | function * gen () { |
throw()
通过throw方法在Generator外部控制内部执行的“终断”
1 | function * gen () { |
Scene Practice 抽奖(举个例子)
ES5写法
1 | function draw (first = 1, second = 3, third = 5) { |
ES6写法
1 | function * draw (first = 1, second = 3, third = 5) { |
另一个例子:找到3的倍数的数字
1 | function * count (x = 1) { |
Iterator(如何让不支持遍历的数据结构“可遍历”)
lterator就是ES6中用来实现自定义遍历的接口
1 | let authors = { |
第二种写法:Generator(天然满足可迭代协议)
用gen写,省去写done,value
1 | authors[Symbol.iterator] = function * () { |
两个概念:
迭代器协议
1、首先,他是一个对象
2、其次,这个对象包含一个无参函数next
3、最后,next返回一个对象,包含done和value属性
可迭代协议
可迭代协议允许JavaScript对象去定义或定制他们的迭代行为。
一般object不可遍历
如果让一个对象是可遍历的,就要遵守可迭代协议,要求对象要部署一个以Symbol.iterator为key的键值对,而value就是一个无参函数,这个函数返回的对象要遵守迭代器协议。
Export Import(如何把代码进行模块化设计)
模块,通过import、export来实现原生JavaScript的导入导出
1 | //导出变量 |
1 | //导出函数 |
多个对象导出(应用解构赋值)
1 | //导出 |
类
1 | //导出 |
多模块导入
1 | import * as Mod from './lesson2-14-mod' //*表示全部 |