Javascript 使用while循环而不是for循环进行迭代
ECMAScript 6为迭代引入了生成器、迭代器和语法。Node.JS v0.11.4,带有标志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;
--和声--使用\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