当我遇到一些奇怪的行为时,我正在编写一个 javascript 程序并在 Chrome 7 中运行它。现在,在我的代码中,所有其他事情都在进行,我花了一些时间才弄清楚那不是我。
我已经提炼出下面代码的本质。
<html>
<script>
var data = [1,2,3,4,5];
var data_copy = [];
for (var i=0; i<data.length; i++){
data_copy.push(data[i]);
}
console.log("Printing before:");
console.log(data_copy);
//alert(data_copy);
console.log("------------------------");
for (var i=0; i<data_copy.length; i++){
data_copy[i] = data_copy[i] * 1000;
}
console.log("Printing after:");
console.log(data_copy);
</script>
</html>
当我在 Chrome 7 上运行它时,我在 Javascript 控制台中得到如下输出:
Printing before:
[1000, 2000, 3000, 4000, 5000]
------------------------
Printing after:
[1000, 2000, 3000, 4000, 5000]
为什么第一次调用 console.log 会打印更改后的 data_copy 版本?
现在,如果我取消注释“警报”并运行相同的代码,我会得到您通常期望的结果:
Printing before:
[1, 2, 3, 4, 5]
------------------------
Printing after:
[1000, 2000, 3000, 4000, 5000]
我还尝试了 node.js 中的代码,我得到了第二个(正常)输出。
有什么想法吗?
这是 JIT 优化出了问题吗?
还是我遗漏了一些明显的东西?
最佳答案
将 console.log(data_copy)
更改为 console.log(String(data_copy))
。
console.log
通过引用 Chrome 的控制台有效地发送对象。 alert
会中断您的脚本,因此第一个记录的 data_copy
在稍后的修改之前呈现;如果没有,整个脚本会在控制台呈现 data_copy
引用之前运行完成。
关于javascript - 变量在事实发生之前改变了,你能解释一下这个 Chrome V8 行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4319979/