Firefox 37上console.log()的奇怪行为

DrK*_*Key 5 javascript browser firefox

几分钟前,在玩javascript时,我注意到了一个奇怪的行为console.log().实际上它似乎记录了"扭曲"的变量.看看以下内容:

var res = document.getElementById("res");
var arr = ["1", "2", "3"];
arr.push("4");
res.innerHTML = JSON.stringify(arr)+'<br>';
console.log(arr);
arr.push("5");
res.innerHTML += JSON.stringify(arr);
console.log(arr);
Run Code Online (Sandbox Code Playgroud)
<div id="res"></div>
Run Code Online (Sandbox Code Playgroud)

它将正确的变量打印#res到浏览器控制台中(Firefox 37)

在此输入图像描述

有人能解释我为什么会这样吗?

spe*_*der 2

因此,如果您更改日志记录以便获取数组的副本:

var arr = ["1", "2", "3"];
arr.push("4");
console.log(arr.slice());
arr.push("5");
console.log(arr.slice());
Run Code Online (Sandbox Code Playgroud)

一切都按预期进行。

我不考虑“实时”跟踪的可能性,因为以下示例没有显示实时跟踪的任何证据:

var arr = ["1", "2", "3"];
console.log(arr);
var i;
i = setInterval(function(){
  arr.push(1);
  console.log(arr);
  if(arr.length>10)clearInterval(i)
},1000);
Run Code Online (Sandbox Code Playgroud)

这意味着日志记录已排队,并且队列直到最后一次推送到数组之后才会运行(可能直到您的 JavaScript 执行完毕)。

不错的发现......绝对是一些可能会吸引开发人员的东西。