变量事先改变了,你能解释一下这个Chrome V8的行为吗?

时间:2010-12-01 00:00:16

标签: javascript google-chrome

当我遇到一些奇怪的行为时,我正在编写一个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优化出错了吗?

或者我错过了一些明显的东西?

2 个答案:

答案 0 :(得分:4)

console.log(data_copy)更改为console.log(String(data_copy))

console.log通过引用Chrome的控制台有效地发送对象。 alert会中断您的脚本,以便在稍后的修改之前呈现第一个记录的data_copy;如果没有,整个脚本会在控制台呈现data_copy引用之前运行完成。

答案 1 :(得分:1)

见crbug.com/44720