Chrome开发者工具中奇怪的console.log行为

可能重复:
Chrome的JavaScript控制台懒惰评估数组?

打开Chrome开发者工具并input:

var a = [];console.log(a);a.push(1);console.log(a);

你会期望这会输出类似的东西

 [] [1] 

但是,它输出

 [1] [1] 

行为是一样的

var a = [];console.log(a);a[0] = 1;console.log(a);

任何人都可以解释此行为?

在OS X上运行Chrome。在32位Windows 7上具有相同的行为。

编辑 :行为是相同的,不pipe这些语句是否在同一行上。 我只是简单地将它们提供在一条线上,以便于testing。

 var a = []; console.log(a); a.push(1); console.log(a); 

在一个文件然后运行它产生相同的行为。

编辑x 2请参阅: http : //jsfiddle.net/9N4A6/如果你不想做一个文件来testing。

试试这个:

 var a = []; console.log(a.toString()); a.push(1); console.log(a.toString()); 

我敢打赌,这并不是说评估的顺序是奇怪的,而是在将所有对象转换为可打印的forms之后,才会在执行完所有语句之后,才能真正转储出日志。

与x64机器上的Win7一样的行为。 我的猜测是,日志方法持有一个引用,并排队恰好在一行中的调用。

编辑这不是一个单独的Chrome / Ium问题,我见证了与Firebug相同。 正如我所说的控制台日志logging必须在某些方面排队。

至less在数组中,可以为每个日志调用克隆数组:

 var a = [];console.log([].concat(a));a.push(1);console.log([].concat(a)); 

对于对象,我推荐JSON:

 var a = {};console.log(JSON.stringify(a));a[0]=1;console.log(JSON.stringify(a)); 

什么是“logging”是对象“a”…不是“a”的纯文本表示。 日志显示足够聪明,可以显示对象“a”的占位符,“稍后”会填充/填充对象(好像在事件调用结束时)。 如果你坚持一个alert()语句,你会看到你期望的值(logging值被“填充”):

 var a = []; console.log(a); alert('force console to display correctly'); a.push(1); console.log(a); 

这似乎像Chrome中的一个错误(有点高飞不得不把警报声明在看到正确的日志信息)。

(注意这个问题显示在谷歌search“console.log chrome只显示当前值”的顶部,所以我想我会添加我的答案)

是的,它也是在对象上做的….如果你稍后改变它的值(比如几秒钟后),然后在控制台中展开这个对象,那么新的值就会在那里。 奇怪的,但在某种意义上可以是有用的。

如果你想要当前值,只要说“console.log(a.toString());” 或类似的。