为什么ES6中的Iterator.next()方法只能返回值?

时间:2016-11-03 07:51:10

标签: javascript iterator ecmascript-6

要在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());
}

1 个答案:

答案 0 :(得分:1)

  

这似乎是浪费资源

事实并非如此。引擎非常擅长优化短期对象分配。另一方面,您的方法需要两个方法调用,它们也是免费的。

  

对象创建不太可能比方法调用便宜

这可能是你错误的地方。

  

为什么他们首先会返回两个值,因为这是一个非常明显的选择,看起来更干净,效率更高?

嗯,很清楚为什么需要这两个值(另一种方法是抛出IterationEnd异常,但这被视为真的丑陋)。迭代时总是需要它们。那么为什么他们会选择两个独立的方法,这些方法总是必须被称为(繁琐且可能容易出错),而当一个非常明显的替代方案看起来更清晰,更有效时呢?

有关讨论,请参阅https://esdiscuss.org/topic/performance-of-iterator-next-as-specified