Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

重学js —— 控制抽象对象之Iteration(迭代)和所有Generator对象 #130

Open
lizhongzhen11 opened this issue Jul 13, 2020 · 0 comments
Labels
js基础 Good for newcomers 重学js 重学js系列 规范+MDN

Comments

@lizhongzhen11
Copy link
Owner

lizhongzhen11 commented Jul 13, 2020

Iteration(迭代)和所有Generator对象

通用迭代接口

Iterable接口

属性 要求
@@iterator 一个返回 Iterator 对象的函数 返回的对象必须符合 Iterator 接口

Iterator接口

属性 要求
"next" 一个返回 IteratorResult 对象的函数 返回的对象必须符合 IteratorResult 接口。如果 Iteratornext 方法先前已被调用且返回了 IteratorResult 对象,同时该返回对象的 "done" 属性为 true,那么之后的所有对 next 方法的调用都会返回这个 "done" 属性为 trueIteratorResult 对象。但是,并不强制执行此要求。
Iterator接口可选的属性列表
属性 要求
"return" 一个返回 IteratorResult 对象的函数 返回的对象必须符合 IteratorResult 接口。调用此方法会通知 Iterator 对象,调用者不打算再对 Iterator 进行下一个方法调用。返回的 IteratorResult 对象通常有个值为 true"done" 属性;同时还有个 "value" 属性,其值作为 return 方法的参数传递。但是,并不强制执行此要求。
"throw" 一个返回 IteratorResult 对象的函数 返回的对象必须符合 IteratorResult 接口。调用此方法会通知 Iterator 对象调用者已检测到错误情况。参数可能被用来识别错误情况且通常是个异常对象。通常的响应是将该值作为参数 抛出。如果方法不 抛出,那么返回的 IteratorResult 对象的 "done" 属性值通常是 true

AsyncIterable接口

属性 要求
@@asyncIterator 一个返回 AsyncIterator 对象的函数 返回的对象必须符合 AsyncIterator 接口

AsyncIterator接口

属性 要求
"next" 一个返回 IteratorResult 对象的 promise 的函数 返回的promise在实现时必须使用符合 IteratorResult 接口的对象来实现。如果 AsyncIteratornext 方法先前已被调用且返回了 IteratorResult 对象,同时其 "done" 属性为 true,那么对该对象的 next 方法的所有后续调用也应为 "done" 属性为 trueIteratorResult 对象返回一个promise。
此外,用于实现值的 IteratorResult 对象应具有一个 "value" 属性,其值不是 promise(或"thenable")。但是,并不强制执行此要求。
AsyncIterator接口可选的属性列表
属性 要求
"return" 一个返回 IteratorResult 对象的 promise 的函数 返回的promise在实现时必须使用符合 IteratorResult 接口的对象来实现。调用该方法通知 AsyncIterator 对象,调用者不会继续调用 next 方法。返回的 promise 将通过 IteratorResult 对象完成,其通常有个值为 true"done" 属性,并且 "value" 属性和值会作为参数传递给 return 方法。但是,并不强制执行此要求。
此外,用作实现值的 IteratorResult 对象应具有 "value" 属性,其值不能是 promise(或"thenable")。如果以典型的方式使用参数值,如果它是个被拒绝的promise,那么应该返回一个具有相同原因而被拒绝的promise;如果它是完成的promise,那么它的完成值应该作为返回的promise的 IteratorResult 对象的 "value" 属性完成值。但是,并不强制执行此要求。
"throw" 一个返回 IteratorResult 对象的 promise 的函数 返回的promise在实现时必须使用符合 IteratorResult 接口的对象来实现。调用该方法通知 AsyncIterator 对象,调用者检测到错误。参数能被用来识别错误情况并且通常是个异常对象。通常的响应为返回一个被拒绝的promise,该promise将以传递的值作为参数变为拒绝状态。
如果返回完成的promise,IteratorResult 完成值通常有个值为 true"done" 属性。此外,它也有个 "value" 属性,其值不是 promise(或"thenable"),但是,并不强制执行此要求。

IteratorResult 接口

属性 要求
"done" true或false iterator 对象 next 方法调用后的结果状态。如果到了迭代器的末尾,则 "done"true。否则 "done"false 且value值可见。如果 "done" 属性不存在(自身没有,也没有继承),那么值为 false
"value" 任何 ECMAScript语言值 如果 donefalse,该值为当前迭代器的值。如果 donetrue,值为迭代器的返回值(如果迭代器提供的话,不提供就是 undefined 了)。如果迭代器没有返回值,那么就返回 undefined。这种情况下,如果对象没有继承显式的 "value" 属性,则 "value" 属性可能不存在。

%IteratorPrototype%对象

  • 有个 [[Prototype]] 内置插槽其值为 %Object.prototype%
  • 属于 普通对象

%AsyncIteratorPrototype%对象

  • 有个 [[Prototype]] 内置插槽其值为 %Object.prototype%
  • 属于 普通对象

GeneratorFunction 函数对象

构造器

  • 即固有对象 %GeneratorFunction%
  • 不是全局对象,需要获取
  • ...
const GeneratorFunction = Object.getPrototypeOf(function*(){}).constructor

GeneratorFunction构造器属性

  • 标准内置 函数对象,继承自函数构造器
  • 有个 [[Prototype]] 内置插槽其值 %Function%
  • 有个 "name" 属性其值为 "GeneratorFunction"

GeneratorFunction原型对象

AsyncGeneratorFunction对象

AsyncGeneratorFunction构造器

  • 即固有对象 %AsyncGeneratorFunction%
  • ...

AsyncGeneratorFunction构造器属性

  • 标准内置 函数对象,继承自函数构造器
  • 有个 [[Prototype]] 内置插槽其值 %Function%
  • 有个 "name" 属性其值为 "AsyncGeneratorFunction"

AsyncGeneratorFunction原型对象上的属性

Generator对象

Generator原型对象上的属性

  • 即固有对象 %GeneratorPrototype%
  • %Generator% "prototype" 属性初始值
  • 属于 普通对象
  • 不是 Generator 实例,没有 [[GeneratorState]] 内置插槽
  • 有个 [[Prototype]] 内置插槽其值为 %IteratorPrototype%
  • 所有 Generator 实例都继承它拥有的属性
内置插槽 描述
[[GeneratorState]] generator的当前执行状态。可能值为:undefinedsuspendedStartsuspendedYieldexecuting,和 completed
[[GeneratorContext]] 执行该 generator 代码的 执行上下文

AsyncGenerator对象

AsyncGenerator原型对象上的属性

  • 即固有对象 %AsyncGeneratorPrototype%
  • %AsyncGenerator% "prototype" 属性初始值
  • 属于 普通对象
  • 不是 AsyncGenerator 实例,没有 [[AsyncGeneratorState]] 内置插槽
  • 有个 [[Prototype]] 内置插槽其值为 %AsyncIteratorPrototype%
  • 所有 AsyncGenerator 实例都继承它拥有的属性

AsyncGenerator实例上的属性

内置插槽 描述
[[AsyncGeneratorState]] 异步生成器的当前执行状态。可能的值:undefinedsuspendedStartsuspendedYieldexecutingawaiting-returncompleted
[[AsyncGeneratorContext]] 执行该异步生成器代码的 执行上下文
[[AsyncGeneratorQueue]] AsyncGeneratorRequest记录列表,表示恢复异步生成器的请求
@lizhongzhen11 lizhongzhen11 added js基础 Good for newcomers 重学js 重学js系列 规范+MDN labels Jul 13, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
js基础 Good for newcomers 重学js 重学js系列 规范+MDN
Projects
None yet
Development

No branches or pull requests

1 participant