我在 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]
我在 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]
这是因为日志会延迟到 Chrome 有时间执行(即您的脚本释放 CPU)。
试试这个以了解会发生什么:
var t=[0,2];
console.log(t);
setTimeout(function() {
t[0]+=2;
console.log(t);
}, 1000);
它输出你所期望的。
这是 Chrome 的错误吗?也许是优化的副作用。至少这是一个危险的设计...
为什么有区别?我想 Chrome 临时存储它必须记录的内容,在第一种情况下作为主要(不可变)值,在最后一种情况下作为指向数组的指针。
chrome/ff 中的 console.log 是异步的,记录的对象在扩展时被解释。. 如果您想查看当时的值(对于数组),请制作对象的副本:
t=[0,2];
console.log(t.slice(0));
t[0]+=2;
console.log(t);
对于数组,调用 .slice 将复制数组而不创建引用。我不建议使用超时:这确实不能解决问题,只是暂时绕过它。
您所做的一切都是正确的,但是 chrome 的日志记录很混乱/延迟。尝试复制变量并将其添加到其中,您会发现您的代码是正确的。
Chrome 的日志记录在较新的版本中有所延迟,从您的角度来看没有问题。复制变量或使用setTimeout
.