7.4 Operations on Iterator Objects

25.1有对Iterator的介绍

7.4.1 GetIterator ( obj [ , method ] )

这个抽象操作执行过程如下:

  • 如果 method 没传, 那么:
    • 使 method 为 GetMethod(obj, @@iterator).
  • 使 iterator 为 Call(method, obj).
  • 如果 Type(iterator) 不是 Object, 抛出TypeError异常.
  • 返回 iterator.

7.4.2IteratorNext ( iterator [ , value ] )

这个抽象操作执行过程如下:

  • 如果 value 没传, 那么:
    • 使 result 为 Invoke(iterator, “next”, « »).
  • 否则,
    • 使 result 为 Invoke(iterator, “next”, « value »).
  • 如果 Type(result) 不是 Object, 抛出TypeError异常.
  • 返回 result.

7.4.3 IteratorComplete ( iterResult )

这个抽象操作执行过程如下:

  • 断言:: Type(iterResult) 是 Object.
  • 返回 ToBoolean(? Get(iterResult, “done”)).

7.4.4 IteratorValue ( iterResult )

这个抽象操作执行过程如下:

  • 断言:: Type(iterResult) 是 Object.
  • 返回 ? Get(iterResult, “value”).

7.4.5 IteratorStep ( iterator )

这个抽象操作探测Iterator是否到达结束,操作过程如下:

  • 使 result 为 IteratorNext(iterator).
  • 使 done 为 IteratorComplete(result).
  • 如果 done 是 true, 返回 false.
  • 返回 result.

7.4.6 IteratorClose ( iterator, completion )

这个抽象操作是用来提醒Iterator应该执行它成为完成状态时应该执行的操作:

  • 断言:Type(iterator) 是 Object.
  • 断言:completion 是 Completion Record.
  • 使 return 为 GetMethod(iterator, “return”).
  • 如果 return 是 undefined, 返回 Completion(completion).
  • 使 innerResult 为 Call(return, iterator, « »).
  • 如果 completion.[[Type]] 是 throw, 返回 Completion(completion).
  • 如果 innerResult.[[Type]] 是 throw, 返回 Completion(innerResult).
  • 如果 Type(innerResult.[[Value]]) 不是 Object, 抛出TypeError异常.
  • 返回 Completion(completion).

7.4.7 CreateIterResultObject ( value, done )

这个抽象操作执行过程如下:

  • 断言:Type(done) 是 Boolean.
  • 使 obj 为 ObjectCreate(%ObjectPrototype%).
  • 执行 CreateDataProperty(obj, “value”, value).
  • 执行 CreateDataProperty(obj, “done”, done).
  • 返回 obj.

7.4.8 CreateListIterator ( list )

这个抽象操作执行过程如下:

  • 使 iterator 为 ObjectCreate(%IteratorPrototype%, « [[IteratorNext]], [[IteratedList]], [[ListIteratorNextIndex]] »).
  • 设置 iterator 的内部属性 [[IteratedList]] 为 list.
  • 设置 iterator 的内部属性 [[ListIteratorNextIndex]] to 0.
  • 使 next 为一个新的如在7.4.8.1 中定义的 ListIterator next对象
  • 设置 iterator 的内部属性 [[IteratorNext]] 为 next.
  • 执行 CreateMethodProperty(iterator, “next”, next).
  • 返回 iterator.

7.4.8.1 ListIterator next( )

这个抽象操作执行过程如下:

  • 使 O 为 this value.
  • 使 f 为 active function object.
  • 如果 O 没有 [[IteratorNext]] 内部属性, 抛出TypeError异常.
  • 使 next 为 O 的内部属性 [[IteratorNext]].
  • 如果 SameValue(f, next) 是 false, 抛出TypeError异常.
  • 如果 O 没有 [[IteratedList]] 内部属性, 抛出TypeError异常.
  • 使 list 为 O 的内部属性 [[IteratedList]].
  • 使 index 为 O 的内部属性 [[ListIteratorNextIndex]] 的值.
  • 使 len 为 list 元素的个数.
  • 如果 index ≥ len, 那么:
    • 返回 CreateIterResultObject(undefined, true).
  • 设置O的内部属性 [[ListIteratorNextIndex]] 值为 index+1.
  • 返回 CreateIterResultObject(list[index], false).

注意:ListIterator next 方法如果不是应用于最开始关联的那个对象,将会抛出异常