为什么Chrome显示一个值,因为它已经从数组中删除了?

时间:2012-10-09 03:19:16

标签: javascript google-chrome google-chrome-devtools

  

可能重复:
  Is Chrome's JavaScript console lazy about evaluating arrays?

Chrome的js控制台在删除值之前显示一个已删除值的数组。为什么呢?

jsFiddle that demonstrates this behavior

var list=[];
list.push("one");
list.push("two");
list.push("three");
console.log(list);                        //["two", "three", undefined × 1] 
$("#output").append(JSON.stringify(list));//["one","two","three"]

list.shift();

$("#output").append($("<br>"));

console.log(list);                        //["two", "three"] 
$("#output").append(JSON.stringify(list));//["two","three"]

1 个答案:

答案 0 :(得分:6)

Chrome中console.log被“延迟”;在这种情况下,我相信程序的结尾。

也就是说,在Chrome中,console.log 不会立即对输入对象进行字符串化,而是在“一段时间后”执行字符串化(在此情况下对象已被修改)但在实际显示结果之前

console.log(JSON.stringify(list))会显示预期结果。


这被报告为错误as far back as Chrome 5(错误修复目标是Mstone-22,所以不是Chrome 20/21?)并且修复已添加到webkit基地:

  

截至今天,将对象(数组)转储到控制台将导致在控制台对象扩展(即懒惰)时读取对象的属性。这意味着在使用控制台进行调整时转储同一个对象将很难调试。

     

此更改开始在记录时生成对象/数组的缩写预览,并将此信息传递到前端。这只发生在前端已经打开时,它只适用于console.log(),而不适用于实时控制台交互。