console.log中的值错误

时间:2012-06-26 19:15:57

标签: javascript google-chrome

  

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

我在javascript中有以下片段,其输出让我觉得出了问题。

1.

a=2;
console.log(a);
a+=2;
console.log(a);

输出:2 4 ;正如预期的那样

2.

t=[0,2];
console.log(t);
t[0]+=2;
console.log(t);

输出:[2,2] [2,2]

输出不应 [0,2] [2,2] 上述两种情况之间的区别是什么导致两种情况都有不同的答案?

4 个答案:

答案 0 :(得分:15)

这是因为日志会延迟,直到Chrome有时间(即您的脚本释放CPU)。

尝试这样来了解会发生什么:

var t=[0,2];
console.log(t);
setTimeout(function() {
     t[0]+=2;
   console.log(t);
}, 1000);

它输出你期望的结果。

这是Chrome的错误吗?也许是优化的副作用。至少这是一个危险的设计...

为什么会有区别?我想Chrome会暂时存储必须记录的内容,作为第一种情况下的主要(不可变)值,作为最后一种情况下指向数组的指针。

答案 1 :(得分:5)

chrome / ff中的console.log是异步的,记录的对象在它们被展开时被解释。 。如果要在此时查看其值(对于数组),请创建对象的副本:

t=[0,2];
console.log(t.slice(0));
t[0]+=2;
console.log(t);

使用数组,调用.slice将复制数组而不创建引用。 我不建议使用超时:这确实不会解决问题,只是暂时绕过它。

答案 2 :(得分:0)

你所做的一切都是正确的,但是铬的记录是棘手的/延迟的。尝试制作变量的副本并添加到该变量,您将看到您的代码是正确的。

答案 3 :(得分:0)

Chrome的日志记录在较新版本中延迟,您的结果没问题。复制变量或使用setTimeout