console.log 中的值错误

IT技术 javascript google-chrome
2021-02-13 12:19:12

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

我在 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个回答

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

试试这个以了解会发生什么:

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

它输出您期望的内容。

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

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

是的,他们经常玩火
2021-03-30 12:19:12
是的,这几天 chrome 似乎做了很多改变..谢谢 btw :)
2021-04-04 12:19:12

chrome/ff 中的 console.log 是异步的,记录的对象在展开时被解释。. 如果您想查看当时的值(对于数组),请复制该对象:

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

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

您所做的一切都是正确的,但 chrome 的日志记录很糟糕/延迟。尝试制作变量的副本并添加到其中,您将看到您的代码是正确的。

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