要在ES6中实现迭代器,必须实现一个返回如下结构的方法next
:{value: Any, done: Boolean}
。
我知道done
字段对于表示没有更多值是必要的,但我不明白为什么迭代器本身不能简单地拥有做同样工作的领域/方法。
目前,需要在每个迭代步骤中创建一个新对象,作为防范潜在错误的防御措施(例如,如果有人决定保留对结果的引用),它似乎是浪费资源,但他们肯定有理由选择这个界面。
我错过了什么?
[编辑]
我能想到的最明显的替代实现示例:
function iter(arr) {
var idx = 0, done = false;
return {
isDone: function() {
return done;
},
next: function() {
if(idx >= arr.length - 1) {
done = true;
}
return arr[idx++];
}
};
}
var i = iter([1, 2, 3, 4]);
while(!i.isDone()) {
console.log(i.next());
}
答案 0 :(得分:1)
这似乎是浪费资源
事实并非如此。引擎非常擅长优化短期对象分配。另一方面,您的方法需要两个方法调用,它们也是免费的。
对象创建不太可能比方法调用便宜
这可能是你错误的地方。
为什么他们首先会返回两个值,因为这是一个非常明显的选择,看起来更干净,效率更高?
嗯,很清楚为什么需要这两个值(另一种方法是抛出IterationEnd
异常,但这被视为真的丑陋)。迭代时总是需要它们。那么为什么他们会选择两个独立的方法,这些方法总是必须被称为(繁琐且可能容易出错),而当一个非常明显的替代方案看起来更清晰,更有效时呢?
有关讨论,请参阅https://esdiscuss.org/topic/performance-of-iterator-next-as-specified。