如何在循环中使用 shift?

How do I use shift inside a loop?

提问人:Cato Johnston 提问时间:12/26/2011 更新时间:12/26/2011 访问量:966

问:

当我运行这段代码时:

var a = ['a','b','c'];
var b = ['a','b','c'];

for(i = 0; i <= a.length-1; i++){
    b.shift();
    console.log(b);
}

我期望这个输出:

['b','c']
['c']
[]

但我得到这个输出:

[]
[]
[]

为什么?

我如何获得预期的输出?

JavaScript的

评论

0赞 Johan 12/26/2011
我确实得到了你想要的输出..我想控制台.log不是您当前代码中的控制台.log。
0赞 Nabab 12/26/2011
我用相同的代码得到了你期望的确切输出
0赞 techfoobar 12/26/2011
您的代码对我来说工作正常。您指定的预期输出正是我从 Firebug 控制台运行您的代码时得到的。在 Chrome 控制台中,我得到的输出与您得到的输出相同。所以看起来像是 Chrome 中的问题?
0赞 techfoobar 12/26/2011
嗯。。有趣。。看起来 Chrome 的控制台 .log 缓存输出并在循环后将其一起刷新!如果你执行 shift() 和 log(不在循环中),你会得到正确的输出。但是,如果你把它放在一个循环中,它会在所有三种情况下打印出 b 的最终值!
0赞 J. Holmes 12/26/2011
这是控制台.log的webkit“问题”,这里还有其他参考。另一个“修复”是在日志中使用 tostring()

答:

8赞 Guffa 12/26/2011 #1

这是 Chrome 中的已知问题。这是因为 不会复制您想要显示的内容,它只是存储引用。console.log

由于日志不会立即更新,但一旦函数结束并且浏览器更新用户界面,日志将显示变量的当前状态,而不是每次调用时的状态。bconsole.log

为了获得所需的输出,您必须为每个调用制作变量状态的闪存副本:console.log

console.log(b.toString());

评论

0赞 techfoobar 12/26/2011
也许值得注意的是,Firebug 的控制台行为不同。我猜它会创建传递的任何内容的副本,然后打印出来。
0赞 Zirak 12/26/2011
要在控制台中保留阵列外观,可以通过调用array.slice()
0赞 Bergi 12/26/2011
注意:在Opera中也会发生同样的情况
0赞 henrijs 11/27/2014
注意:在Firefox开发者工具中也会发生同样的情况。
1赞 Jon Newmuis 12/26/2011 #2

这是在执行语句时不打印语句的副作用。请注意,如果将 your 替换为 ,则代码将按预期工作。console.logconsole.logalert

0赞 HBP 12/26/2011 #3

或者根据我对 Javascript Funky 数组事故的回答,将日志参数更改为表达式

console.log ('' + b);