javascript - 变量在事实发生之前改变了,你能解释一下这个 Chrome V8 行为吗?

标签 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 版本?

现在,如果我取消注释“警报”并运行相同的代码,我会得到您通常期望的结果:

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/

相关文章:

javascript - HTML5 和 Javascript Canvas 游戏 - 如何让玩家能够保存游戏

javascript - 如何基于redux编写共享路由的react/Angular微应用程序?

javascript - 绑定(bind)事件监听函数,以后需要调用该函数吗?

javascript - Chrome 44 不再支持以下语法 : window. location.href = "javascript:someFunction()"

google-chrome - 谷歌浏览器忽略主机文件

javascript - Protractor 消除警报弹出窗口

javascript - Google map 街景仅在第一次时显示

google-chrome - Chrome Webdriver 在 Selenium 中产生超时

html - -webkit-box 不收缩

python - Chrome 使用 selenium chromedriver 以 “Data;” 打开