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

ant*_*upe 5 javascript google-chrome google-chrome-devtools

可能重复:
Chrome的JavaScript控制台是否懒于评估数组?

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

jsFiddle演示了这种行为.

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"]
Run Code Online (Sandbox Code Playgroud)

小智 6

在Chrome console.log中"延迟"; 在这种情况下到本程序结束我相信.

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

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


据报道,这可以追溯到Chrome 5(错误修复目标是Mstone-22,而不是Chrome 20/21?),并且已经在webkit基础中添加了修复:

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

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

  • 对于对象和数组,如果`console.log()`的确切时间很重要,那么你需要在调用`console.log()`之前将输出转换为字符串,然后不会发生这个问题. (2认同)
  • 看起来像webkit修复它,它正在从http://trac.webkit.org/changeset/125174向下游传播 (2认同)