2010-11-16 46 views
10

可能重复:
Is Chrome's JavaScript console lazy about evaluating arrays?怪异的console.log行为

打开Chrome开发者工具,并键入:

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);

任何人都可以解释这种现象?

在32位在OS X相同的行为运行Chrome的Windows 7

编辑:行为是一样的,不管报表是否在同一行或不行。我只是简单地将它们提供在一条线上,以便于测试。

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

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

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

+1

我的猜测是,调用'控制台。 log(a)'将数组对象排队等待打印,但数组到字符串的转换仅在整行完成后才会发生。 – Pointy 2010-11-16 21:07:04

+0

@CMS:没有看到 - 谢谢 – 2010-11-17 00:13:42

+0

不客气@Jamie :) – CMS 2010-11-17 05:26:13

回答

4

试试这个:

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

它不是评价的顺序是奇怪的,我敢打赌,但该对象的可打印形式的转换发生后都执行的语句,在点时Chrome已准备好实际转储出日志。

+0

那么'var a = []; console.log(a [0]); a [0] = 1; console.log(a [0]);'按预期工作,所以有时console.log不会在打印前执行所有语句。 – 2010-11-16 21:12:35

+1

@maarons,即使打印延迟,实际上也是如此......它将值1发送到console.log(),这是缓存然后显示的内容。 – rob 2010-11-16 21:15:01

3

与x64机器上的Win7一样的行为。我的猜测是日志方法持有对a的引用,并将碰巧排在一行中的调用排队。

编辑这不仅仅是Chrome/ium问题,我也见证了与Firebug相同。正如我所说的,控制台日志记录必须以某种方式排队。

+0

当它们不在一行上时,会发生相同的行为。我只是在一行上做了这件事,让人们更容易粘贴和测试。 – 2010-11-16 21:17:21

+0

不能,使用多个语句时无法确认问题。按原样工作。我应该补充一点,我使用的是Chromium版本。 – aefxx 2010-11-16 21:20:46

+0

打开控制台:http://jsfiddle.net/9N4A6/ – 2010-11-16 21:44:09

1

是的,它也可以在对象上执行该操作....并且如果稍后更改值(比如几秒钟后),然后在控制台中展开对象,则新值将位于该对象中。奇怪,但在某种意义上可以是有用的。

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

2

至少使用数组,你可以克隆为每个日志调用数组:

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)); 
2

什么东西被“记录”是对象“一“...不是”a“的纯文本表示。日志显示足够聪明,可显示对象“a”的占位符,该对象将在“稍后”被填充/填充(好像在事件调用结束时)。如果你坚持警报()语句中,你会看到你所期望的值(记录值获得“填充”):

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

这似乎是在Chrome给我一个bug(有点愚蠢不得不把警报声明以查看正确的日志记录信息)。

(注意这个问题表现在谷歌搜索的顶部“的console.log铬只显示当前值”,所以我想我会加入我的答案)

+0

这不是Chrome的问题 - 这是Webkit的问题。 Safari中会发生同样的错误。 – 2012-08-14 21:07:44