gpt4 book ai didi

javascript - 如何像 EC​​MA6 提案中那样使用迭代器?

转载 作者:行者123 更新时间:2023-11-30 17:14:34 26 4
gpt4 key购买 nike

我正在尝试弄清楚如何使用当前 ECMA6 draft 中定义的迭代器.

提出迭代器如下:

function makeIterator(array){
var nextIndex = 0;

return {
next: function(){
return nextIndex < array.length ?
{value: array[nextIndex++], done: false} :
{done: true};
}
}
}

我觉得我错过了一些东西,因为这意味着你必须以这种方式使用它:

var it = makeIterator(someArray);
var current = it.next();

while (current.done !== true){
console.log(current.value);
current = it.next();
}

因为,当然,像这样的东西确实会跳过值:

var it = makeIterator(someArray);

while (it.next().done !== true){
console.log(it.next().value);
}

来自 Java 世界,我很困惑为什么他们不包含 hasNext 函数。因为这将允许以下用法:

function makeBetterIterator(array){
var nextIndex = 0;

return {
next: function(){
return nextIndex < array.length ?
{value: array[nextIndex++], done: false} :
{done: true};
},
hasNext: function(){
if(nextIndex < array.length){
return true;
}else{
return false;
}
}
}
}

var someArray = ["one", "two", "three", "four", "five"];

var it = makeBetterIterator(someArray)

while (it.hasNext() === true){
console.log(it.next().value);
}

是否有更简单的方法来使用迭代器,或者它应该如何完成?如果没有更简单的方法,为什么在明显有更好的解决方案的情况下提出这样的迭代器?

最佳答案

为了避免 while 循环之前的重复,你可以做一些像这样简单的事情:

var it = makeIterator(someArray);

while (true) {
var current = it.next();
if (current.done) break;
console.log(current.value);
}

但实际上,在 ES6 中,您会这样做:

for (var val of makeIterator(someArray)) {
console.log(val);
}

ES6 迭代器协议(protocol)很简单,因为 Iterator iterface只需要一个返回 IteratorResult 的方法 (next)包含 done 和可选的 value。一旦协议(protocol)成为标准,那么任何实现它的东西都将获得支持它的语言级语句的所有好处(如 for...of)。

关于javascript - 如何像 EC​​MA6 提案中那样使用迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26365113/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com