gop*_*410 13 javascript google-chrome
我在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会暂时存储必须记录的内容,作为第一种情况下的主要(不可变)值,作为最后一种情况下指向数组的指针.
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将复制数组而不创建引用.我不建议使用超时:这确实无法解决问题,只是暂时绕过它.