如何在循环中使用shift?

4
当我运行这段代码时:
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']
[]

但是我得到了这个输出结果:

[]
[]
[]

为什么?

我如何获得期望的输出?


我得到了你想要的输出... 我猜测在你当前的代码中,console.log不是一个真正的console.log。 - Johan
我使用相同的代码得到了你期望的精确输出。 - Nabab
你的代码在我这里运行正常。你所期望的输出与我在 Firebug 控制台上运行你的代码得到的完全相同。在 Chrome 控制台中,我得到了与你获取的相同的输出。看起来是 Chrome 的问题? - techfoobar
嗯...有趣...看起来Chrome的console.log会缓存输出并在循环后一起刷新!如果你执行shift()和log(不在循环中),你会得到正确的输出。但是如果你把它放在一个循环中,它会打印出所有三种情况下b的最终值! - techfoobar
这是一个与console.log有关的webkit“问题”,在这里还有其他相关引用。另一个“解决方法”是在您的日志中使用tostring()。 - J. Holmes
3个回答

8
这是一个Chrome中已知的问题。因为console.log不会复制要显示的内容,它只存储引用。
由于日志不会立即更新,而是在函数结束并且浏览器更新用户界面时更新,因此日志将显示b变量的当前状态,而不是每个console.log调用时的状态。
要获得所需的输出,您需要为每个console.log调用创建状态的快照。
console.log(b.toString());

也许值得注意的是 Firebug 的控制台行为不同。我猜它会创建任何传递的副本,然后将其打印出来。 - techfoobar
为了在控制台中保留数组的外观,您可以通过调用 array.slice() 创建另一个数组副本。 - Zirak
注意:在Opera中也会发生同样的情况。 - Bergi
注意:在Firefox开发者工具中也会发生相同的情况。 - henrijs

1
这是由于console.log语句在执行时未被打印的副作用。请注意,如果您将console.log替换为alert,则代码将按预期工作。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接