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

时间:2010-11-16 21:01:35

标签: javascript google-chrome

  

可能重复:
  Is Chrome's JavaScript console lazy about evaluating arrays?

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

任何人都可以解释这种行为吗?

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

编辑:无论语句是否在同一行,行为都是相同的。我只需将它们放在一行就可以轻松测试。

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

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

编辑x 2 如果您不想制作要测试的文件,请参阅:http://jsfiddle.net/9N4A6/

5 个答案:

答案 0 :(得分:4)

请改为尝试:

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

评估的顺序并不奇怪,我敢打赌,但是在Chrome准备好实际转储日志之后,将语句转换为可打印的形式发生在语句全部执行之后。

答案 1 :(得分:3)

与x64机器上的Win7相同。我的猜测是,log方法保存对a的引用,并将恰好位于一行的调用排队。

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

答案 2 :(得分: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));

答案 3 :(得分:2)

正在“记录”的是对象“a”...而不是“a”的纯文本表示。日志显示足够聪明,可以显示对象“a”的占位符,后者将在“稍后”填充/填充(似乎在事件调用结束时)。如果你坚持使用alert()语句,你会看到你期望的值(记录的值得到“填写”):

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

这对我来说似乎是Chrome中的一个错误(有点傻到必须发出警告声明以查看正确的日志信息)。

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

答案 4 :(得分:1)

是的,它也会在对象上执行....并且如果稍后更改值(比如说,很多秒后),然后在控制台中展开对象,则新值将在那里。很奇怪,但在某种意义上可能很有用。

如果你想要当前值,只需说“console.log(a.toString());”等等。