Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用while循环而不是for循环进行迭代_Javascript_Ecmascript 6 - Fatal编程技术网

Javascript 使用while循环而不是for循环进行迭代

Javascript 使用while循环而不是for循环进行迭代,javascript,ecmascript-6,Javascript,Ecmascript 6,ECMAScript 6为迭代引入了生成器、迭代器和语法。Node.JS v0.11.4,带有标志 --和声--使用\u strict--和声\u生成器 了解以下生成器 function* fibonacci() { let previous = 0; let current = 1; while(true) { let temp = previous; previous = current; yield current = temp + current;

ECMAScript 6为迭代引入了生成器、迭代器和语法。Node.JS v0.11.4,带有标志

--和声--使用\u strict--和声\u生成器

了解以下生成器

function* fibonacci() {
  let previous = 0;
  let current = 1;

  while(true) {
    let temp = previous;
    previous = current;
    yield current = temp + current;
  }
}
然后我可以打印小于1000的斐波那契数

for(let value of fibonacci()) {
    if(value > 1000) { break; }
    console.log(value);
}
对于本例,使用
while
循环而不是
For
循环将更自然,类似于

while(value of fibonacci() < 1000) {
    console.log(value);
}
while(fibonacci()的值<1000){
console.log(值);
}

迭代器的迭代可以用
while
循环而不是
for
循环来完成吗?

这样的事情你满意吗

var sequence = fibonacci();
var value;
while ((value = sequence.next()) < 1000) {
    console.log(value);
}
var序列=fibonacci();
var值;
而((value=sequence.next())<1000){
console.log(值);
}
另外,也许更好的解决方案是:

function* fibonacci(limit){
  let previous = 0;
  let current = 1;

  while(previous + current < limit) {
    let temp = previous;
    previous = current;
    yield current = temp + current;
  }
}

for(let value of fibonacci(1000)) {
    console.log(value);
}
函数*fibonacci(极限){
设previous=0;
设电流=1;
同时(上一次+电流<极限){
设temp=上一个;
先前=当前;
输出电流=温度+电流;
}
}
for(斐波那契(1000)的let值){
console.log(值);
}

是的,可以使用常规生成器方法执行此操作

var fib = fibonacci(), value;
while( (value = fib.next()) < 1000 ) {
    console.log(value);
}
var fib=fibonacci(),值;
而((value=fib.next())<1000){
console.log(值);
}

尽管我似乎更喜欢
for…of
语句,它负责处理下一个调用和
StopIteration
(如果序列是有限的)。

考虑到支持此行为的其他语言,我有两种可能的方法:

1) 一个是使用Harmony代理,它可以让你做元表(有点像在lua中),并允许懒惰的iterables。这将提供以下符号:

var arr = ...; // create the resource
for(var i=0;arr[i]<1000;i++){
    arr[i]; // consume fibonacci numbers
}

第一种方法-使用harmony代理 注意<代码>for of在对象中循环。它根本不能保证秩序。但是,您可以执行以下操作来获得惰性迭代的概念

您必须使用
--harmony\u生成器
--harmony\u代理
标志运行节点:

var arr = ...; // create an array and proxy it, use a generator internally
arr[50]; // will calculate the 50th fibonacci element and return it.
arr[100];// will calculate the 100th fibonacci element and return it.
for(var i=0;arr[i]<1000;i++){
   arr[i];//the i-th fibonacci number
}
(只是不要期望它会很快)

*(使用旧的代理表示法,因为新的代理表示法在节点中还不受支持,所以在获得支持后将进行更新)


另请注意,在JavaScript中,由于函数可以通过闭包具有内部状态,所以实际上并不需要生成器

function* fibonacci() {
  let previous = 0;
  let current = 1;

  while(true) {
    let temp = previous;
    previous = current;
    yield current = temp + current;
  }
}
第二种方法,使用迭代器
Take
函数。 对于这个用例,在C语言中通常会这样做

function takeWhile(generating, predicate){
    var res = [],last;
    do{
        res.push(last=generating())
    }while(predicate(last));
    return res;
} 
然后做一些类似的事情

var res = takeWhile(fibIterator,function(item){
    return item<1000;
});
res.forEach(function(){ ...
var res=takeWhile(fibIterator,函数(项){
退货项目
函数*bar(){
产量1;
产量2;
产量3;
返回4;
}
var值,
g=杆();
while((value=g.next()).value){
console.log(值);

}
@Randomblue我认为这是OPs问题中的一个错误,而不是答案。@fsw这是错误的。@AaditMShah不,根据规范
函数*
将函数标记为生成器。@fsw Mozilla当前的生成器实现是一个笑话:)这就是为什么。老实说,他们只是实现了生成器(顺便说一句,
也不在规范中)在规范中出现之前,这就是为什么他们会做一些愚蠢的事情,比如在完成迭代时抛出异常(比如python生成器和C#生成器).更正我的上一条评论,因为它不能再修改了-显然是因为…除了.forEach之外,规范中还包含了…个循环。对于错误信息,我深表歉意。@Randomblue,如果你认为这有帮助的话-当然。你更喜欢哪个版本?(这样就可以继续计票了)回答一个已经接受答案的2年前的问题,你可能想解释一下以前没有的解决方案。也许在一小段中?也许在StackOverflow中练习这个问题不起作用。它以未完成的值结束。在
收益率2
之后插入一个
收益率0
,然后看着它失败。你可能需要
while(!(value=g.next()).done){
var res = takeWhile(fibIterator,function(item){
    return item<1000;
});
res.forEach(function(){ ...
function take(generating,numToTake){
    var res = [],num;
    do{
        res.push(last=generating())
    }while(num++ < numToTake);
    return res;
}

var res = take(fibIterator,1000);//first 1000 numbers