Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我需要一个关于JavaScript可重用性的深入解释。_Javascript - Fatal编程技术网

我需要一个关于JavaScript可重用性的深入解释。

我需要一个关于JavaScript可重用性的深入解释。,javascript,Javascript,我们为什么需要它们以及它们是如何使用的,以及向一个没有Iterable功能的对象添加Iterable功能。这似乎只是一个泛泛的话题。我不敢相信这里还没有答案,但我找不到答案 JavaScript迭代器使用全局符号Symbol.iterator来定义调用时返回对象的函数。该对象有一个方法next,该方法返回另一个具有两个属性的对象:value(迭代器的当前值)和done(迭代器是否完成)。例如: const foo = {}; foo[Symbol.iterator] = function* ()

我们为什么需要它们以及它们是如何使用的,以及向一个没有Iterable功能的对象添加Iterable功能。这似乎只是一个泛泛的话题。

我不敢相信这里还没有答案,但我找不到答案

JavaScript迭代器使用全局符号
Symbol.iterator
来定义调用时返回对象的函数。该对象有一个方法
next
,该方法返回另一个具有两个属性的对象:
value
(迭代器的当前值)和
done
(迭代器是否完成)。例如:

const foo = {};
foo[Symbol.iterator] = function* () {
  let i = 0;
  yield ++i;
};

let iter = foo[Symbol.iterator]();
iter.next(); // { value: 1, done: false }
iter.next(); // { value: 2, done: false }
迭代器还可以与自动构造一起使用,如
for..of
。但是,我在上面定义的一个将不能与的..一起使用,因为它永远不会结束:循环遍历它的所有属性最终将导致内存耗尽。因此,让我们使用一个数组:

const bar = [1,2];
for (let baz of bar) console.log(baz); // logs 1, 2, stops
所有内置集合(弱集合除外)在实现此接口时都可以通过这种方式进行迭代

如果调用者在资源耗尽之前处理完了像文件句柄这样的资源,则可能会显式关闭这些资源。例如,我们将使用带有
readFromFile
getNextLine
函数的假设文件API:

const fileReader = {
  [Symbol.iterator] (path) {
    return {
      fileHandle: readFromFile(path),
      next () {
        return {
          value: this.fileHandle.getNextLine(),
          done: false
        }
      }

      return () {
        this.fileHandle.close();
      }
    }
  }
};
您可以调用
return
方法来防止文件句柄泄漏。更多信息请参见Reg Braithwaite

如果您的迭代器是一个生成器函数,如上面我的无限计数列表中所示,您可以通过
yield
关键字:

foo[Symbol.iterator] = function* () {
  let i = 0;
  let reset = yield ++i;
  if (reset) i = 0;
};

iter = foo[Symbol.iterator]();
iter.next().value;    // 1
iter.next().value     // 2
iter.next(true).value // 1 again
假设您有一些对象
myObject
,希望能够迭代其属性。在下一个示例中,我们将忽略
Object.entries

const myObject = {
  a: 1,
  b: 2
};

Object.defineProperty(myObject, Symbol.iterator, {
  value: function* () {
    for (let key in myObject) {
      if (myObject.hasOwnProperty(key)) {
        yield [key, myObject[key]];
      }
    }
  }
});

iter = myObject[Symbol.iterator]();
iter.next(); // { value: ['a', 1], done: false }
iter.next(); // { value: ['b', 2], done: false }
iter.next(); // { value: undefined, done: true }
注 在ES 2015之前,不保证对象属性具有顺序。如果您在最新的Chrome/FF/Safari中运行上述代码,则所有代码都可以正常工作,但如果您将其传输到较旧的浏览器,您可能会首先看到
['b',2]
输出,或者每次迭代时都会更改


现在,你可能比你真正想知道的更多关于JavaScript可编辑性的信息。

对于关闭/关闭的选民来说,虽然这篇文章在其他地方都有很好的报道,但我找不到一个地方在这里被报道过。如果你仍然觉得它值得结束/否决投票,那是你的权利,但因为这不是一个骗局,也不是(在我看来)太宽泛,我回答了。我完全同意。这个问题肯定没有在任何地方得到详细的回答,因此我提出了一个合理的问题。