console.log中的值错误

gop*_*410 13 javascript google-chrome

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

我在javascript中有以下片段,其输出让我觉得出错了.

1.

a=2;
console.log(a);
a+=2;
console.log(a);
Run Code Online (Sandbox Code Playgroud)

输出:2 4 ; 正如所料

2.

t=[0,2];
console.log(t);
t[0]+=2;
console.log(t);
Run Code Online (Sandbox Code Playgroud)

产出:[2,2] [2,2]

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

Den*_*ret 15

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

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

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

它输出你期望的.

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

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

  • 是的,非常经常他们在玩火 (3认同)

zam*_*uts 6

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

t=[0,2];
console.log(t.slice(0));
t[0]+=2;
console.log(t);
Run Code Online (Sandbox Code Playgroud)

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