小编典典

Google Chrome console.log()与对象和数组不一致

javascript

我今天正在帮助一位同事调试一些代码,但我注意到console.log()Google Chrome中有一个奇怪的行为:

看来,如果您:

  1. 创建一个嵌套数组(例如[[345,“ test”]])

  2. 使用将该阵列记录到控制台console.log()

  3. 修改内部数组值之一,然后console.log()将输出后面的值- 而不是 执行时的数组值console.log()

JavaScript

var test = [[2345235345,"test"]]
console.log(test);
test[0][0] = 1111111;
// outputs: [[1111111,"test"]]

var testb = {};
testb.test = "test";
console.log(testb);
testb.test = "sdfgsdfg";
// outputs: {"testb":"test"}


var testc = ["test","test2"];
console.log(testc);
testc[0] = "sdxfsdf";
// outputs: ["test","test2"]

在Firefox中不会发生此行为。

还要注意,如果我在Chrome调试器中逐行浏览他的代码,console.log()则将输出正确的值。

是否有这种奇怪现象的解释,或者仅仅是Google Chrome的错误?

编辑:

我缩小了重现不一致console.log()行为的步骤:

如果将此脚本添加到页面:

var greetings=['hi','bye'];
console.log(greetings);
setTimeout(function(){
    greetings.push('goodbye');
},3000);

并在 已经打开 Chrome 控制台窗口的 情况下在新窗口中打开它,console.log()与在 控制台窗口关闭的情况下

在第一种情况下,控制台窗口已经打开,console.log()将输出数组的当前值(即两个项目)。

在第二种情况下,只有在页面加载后才关闭并打开控制台窗口,然后才console.log()输出数组的更高值(即三项)。

这是Google Chrome浏览器console.log()功能中的错误吗?


阅读 379

收藏
2020-05-01

共1个答案

小编典典

经过大量挖掘,我发现这已报告为一个错误,已在Webkit中修复,但显然尚未引入Google Chrome。

Description from mitch kramer 2010-03-05 11:37:45 PST

1)创建具有一个或多个属性的对象文字

2)console.log该对象,但保持关闭状态(不要在控制台中扩展它)

3)将其中一个属性更改为新值

现在打开该console.log,您会发现由于某些原因它具有新值,即使它的值在生成时有所不同。

我应该指出,如果您打开它,它将保持正确的值(如果不清楚)。

Chromium开发人员的回复:

评论#2来自帕维尔·费尔德曼(Pavel Feldman)2010-03-09 06:33:36 PST

我认为我们永远都不会解决这个问题。我们无法在将对象转储到控制台中后对其进行克隆,也无法监听对象属性的更改以使其始终真实。

但是,我们应该确保预期存在的行为。

一个修复程序 进行的Webkit,但它似乎没有我们已经进入Chrome浏览器呢。

从今天开始,将对象(数组)转储到控制台中将导致在扩展控制台对象时(即,延迟地)读取对象的属性。这意味着在突变时转储相同的对象将很难使用控制台进行调试。

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

2020-05-01