ES7 手动处理迭代器返回的 done

阅读时长 4 分钟读完

ES7 手动处理迭代器返回的 done

前言

在现代的 JavaScript 开发中,迭代器已经成为了不可或缺的工具。ES6 引入了一种新的语法结构,使得我们可以更加方便地遍历集合中的元素:for...of 循环。for...of 循环背后的工作原理就是迭代器。在 JavaScript 中,任何对象都可以是一个迭代器,只需要在对象上定义一个 next 方法。next 方法返回的是一个对象,该对象包含一个 value 属性和一个 done 属性。value 属性表示当前迭代器所指向的值,而 done 属性则表示是否已经迭代完所有的值。

在ES7中对迭代器做了一些改进,现在我们可以在调用迭代器的 next 方法时手动处理 done 属性。

解析

在ES6中,当调用迭代器的 next 方法时,如果所有的元素都已经迭代完了,那么 done 属性会被设置为 true,同时 value 属性的值是 undefined。当我们使用 for...of 循环时,当 done 属性的值为true时,循环就会自动结束。这种自动结束的行为常常是我们所期望的,但是有时候我们需要手动处理 done 的值以进行一些特殊操作。在ES7中,我们可以在调用迭代器的 next 方法时手动处理 done 属性。

在ES7中,迭代器的 next 方法支持带有参数的形式:

这个 value 参数会被传递给迭代器中暂停的 yield 语句,作为 yield 的返回值。

如果在调用 next 方法时传递了一个参数,而此时迭代器的 done 属性为 true,那么这个参数会被忽略。但是如果 done 属性为 false,那么这个参数会成为 yield 的返回值。

接下来,我们将展示一个使用ES7手动处理 done 属性的例子。

示例代码

-- -------------------- ---- -------
--------- ----------------- -
  ---------------------

  --- ----- - --

  ----- ------ - -- -
    ----- --------
  -

  -------------------
-

----- --------- - ------------------

--- ------ - -----------------

----- -------------- -
  ------------------- ------------------

  ------ - --------------------- --------
-

--------------------
展开代码

在这个例子中,我们定义了一个简单的迭代器 simpleGenerator。该迭代器将输出 Start,然后执行一个 while 循环,返回索引值index,直到 index 大于或等于3为止。最后打印 End。

我们还定义了一个变量 result,用于存储迭代器 simpleGenerator 的下一个 yield 值。我们通过不断循环调用 generator.next() 方法,从而逐一访问这些值。

在我们的 while 循环中,我们首先输出迭代器返回的值。然后,我们手动调用generator.next('hello world') 方法,用一个字符串 'hello world' 作为参数。在 simpleGenerator 迭代器中,我们可以通过 yield 语句来接收这个参数。

在两次执行 generator.next() 方法之间,我们可以手动改变 done 属性的值,进而改变迭代器工作流程。

运行这个代码,我们将看到以下输出:

-- -------------------- ---- -------
-----
------ -
------ ----- -----
------ -
------ ----- -----
------ -
------ ----- -----
---
----
展开代码

结语

在现代的 JavaScript 开发中,迭代器已经成为了不可或缺的工具,可以帮助我们更好的遍历集合中的元素。在ES7中,我们引入了一种更加灵活的手动处理 done 属性的方式,可以更加自由地控制迭代器的工作流程。希望本文对您有所启发,并在实际的开发中有所帮助。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6780ccc5ce7f48612549efbf

纠错
反馈

纠错反馈