可能重复:
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/。
答案 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());”等等。