Discuss / JavaScript / generator最后done的那个值怎么获取?

generator最后done的那个值怎么获取?

Topic source

savokiss

#1 Created at ... [Delete] [Delete and Lock User]
function* foo(x) {
    yield x + 1;
    yield x + 2;
    return x + 3;
}
for(var i of foo(5)){
    console.log(i);
}
//6,7

用for...of怎么获取不到最后return的那个值呢?

廖雪峰

#2 Created at ... [Delete] [Delete and Lock User]

用while循环,扔掉中间值,只留下最后一个

x1ang_li

#3 Created at ... [Delete] [Delete and Lock User]

简短回答: 因为最后一个用的return,而不是yield。如果想要获取最后一个应该用yield

详细回答: 需要考虑for ... of ...的定义:for.. of...本质上就是一个根据iterator不停地调用iter.next()的过程。而EC6中规定,iter.next()本质上返回一个object. 其含有valuedone属性。如果obj.donetrue则表示该iterator结束已经到了最后。

如果我们将 for ... of ... 展开,就会知道底层实现代码大致等效于

while (true) {
    next = iter.next();
    if (next.done) {
        break;
    }
    value = next.value; 
    //... do sth with value.... 
    //... 也就是执行for loop里面的内容...
}

可以看到,next.done的判断被JS解释引擎在代码执行区块之前。

事实上,这么做是一个人性化的设计。这样程序员写脚本时可以所有的返回都一股脑用yield,而不需要额外地将最后一个返回的元素用return。


  • 1

Reply