在for(each)循环中推入堆栈上的项并记录当前堆栈

Pushing items on stack and logging the current stack in a for(each) loop

本文关键字:堆栈 记录 each for 循环      更新时间:2023-09-26

我有以下问题,我似乎不能得到为什么它不工作的方式,我认为它应该工作:

function iterate(somelist){  
    anotherlist = [];
    for(i = 0; i < somelist.length; i++){  
       anotherlist.push(somelist[i]);
       console.log(anotherlist);
    }
}

我希望它做的是记录一个不断增长的列表,但它只是打印完整的列表几次,好像它首先将所有变量推入另一个列表,然后启动日志函数。使用for或foreach循环似乎无关紧要。

我真的不明白为什么它是这样工作的,似乎也想不出一个方法来解决它。

提前感谢,
巴特

顺便说一下,在这种情况下,someelist是我迭代的对象,它似乎有所不同,因为我尝试了一个普通数组,这似乎是有效的。

您可能想要控制台记录新列表

console.log(anotherlist);

我怀疑控制台在更新之前等待线程完成,可能是为了不过多地干扰性能。当控制台UI最终更新时,线程(和循环)已经完成,所有日志引用相同的数组。

要解决这个问题,您可以调用数组的slice()方法来在记录时复制数组:

function iterate(somelist){  
    anotherlist = [];
    for(i = 0; i < somelist.length; i++){  
       anotherlist.push(somelist[i]);
       console.log(anotherlist.slice());
    }
}
var test = [1, 2, 3, 4];
iterate(test);
//-> [1]
//-> [1, 2]
//-> [1, 2, 3]
//-> [1, 2, 3, 4]

听起来你可能会对for(;;)和for(in)循环感到困惑。

For循环就是你从C, Java或基本上任何语言中知道的旧循环。创建一个循环变量,增加它,等等。

当然,你可能不能用for循环迭代对象,因为你需要有一个。length属性…

for(in)循环是而不是 foreach循环!(这种混淆是一个非常常见的Javascript陷阱)

for-in遍历对象属性,因此只能用于迭代对象,而不能用于数组。例如:

var xs = {
   a : 1,
   b : 2
};
for(var i in xs){
    console.log(i, xs[i])
}

将打印

'a', 1
'b', 2