当我遇到一些奇怪的行为时,我正在编写一个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版本?
现在,如果我取消注释“alert”并运行相同的代码,我会得到您通常所期望的内容:
Printing before:
[1, 2, 3, 4, 5]
------------------------
Printing after:
[1000, 2000, 3000, 4000, 5000]
我还尝试了node.js中的代码,然后得到了第二个(普通)输出。
有什么想法吗?
这是一些JIT优化出错了吗?
或者我错过了一些明显的东西?
答案 0 :(得分:4)
将console.log(data_copy)
更改为console.log(String(data_copy))
。
console.log
通过引用Chrome的控制台有效地发送对象。 alert
会中断您的脚本,以便在稍后的修改之前呈现第一个记录的data_copy
;如果没有,整个脚本会在控制台呈现data_copy
引用之前运行完成。
答案 1 :(得分:1)
见crbug.com/44720