我需要一个关于JavaScript可重用性的深入解释。
我们为什么需要它们以及它们是如何使用的,以及向一个没有Iterable功能的对象添加Iterable功能。这似乎只是一个泛泛的话题。我不敢相信这里还没有答案,但我找不到答案 JavaScript迭代器使用全局符号我需要一个关于JavaScript可重用性的深入解释。,javascript,Javascript,我们为什么需要它们以及它们是如何使用的,以及向一个没有Iterable功能的对象添加Iterable功能。这似乎只是一个泛泛的话题。我不敢相信这里还没有答案,但我找不到答案 JavaScript迭代器使用全局符号Symbol.iterator来定义调用时返回对象的函数。该对象有一个方法next,该方法返回另一个具有两个属性的对象:value(迭代器的当前值)和done(迭代器是否完成)。例如: const foo = {}; foo[Symbol.iterator] = function* ()
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可编辑性的信息。对于关闭/关闭的选民来说,虽然这篇文章在其他地方都有很好的报道,但我找不到一个地方在这里被报道过。如果你仍然觉得它值得结束/否决投票,那是你的权利,但因为这不是一个骗局,也不是(在我看来)太宽泛,我回答了。我完全同意。这个问题肯定没有在任何地方得到详细的回答,因此我提出了一个合理的问题。