当前位置: 首页 > 面试题库 >

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

范鸿
2023-03-14
问题内容

我今天正在帮助一位同事调试一些代码,但我注意到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()功能中的错误吗?


问题答案:

经过大量挖掘,我发现这已报告为一个错误,已在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(),不适用于实时控制台交互。



 类似资料:
  • 问题内容: 问题在于确定以下符号之间的权衡: 基于JSON : 基于数组 : 关于同一问题的这篇文章,我已经决定(在前端)使用JSON对象表示法而不是对象数组,因为它符合我的要求,更好的性能和更少的浏览器代码。 但是问题在于列表本身不是静态的。我的意思是,该列表正在生成,即从DB(NoSQL)获取/存储,并通过服务器上的JavaAPI为新条目创建。我无法决定在后端应使用哪种表示法(最终也会影响UI

  • 我使用Nodejs,有一个对象包含一个object数组(API请求的结果)和一个简单的值数组。 它们看起来是这样的: 如何将包含对象数组的对象与简单数组进行比较? 我要找的是,从简单数组中获取ID,并将它们与另一个“复杂”对象进行比较,以检索属性以及简单数组中的相应ID和另一个对象属性,然后将结果存储在一个对象数组中。 简单来说,我希望有这样的结果: 当从API请求中检索“复杂”对象时,我尝试了以

  • 如何在一个对象中存储对象和数组?更新一个对象内的对象和数组 const obj={key1:1,key2:2,key3:3,keys:['key1','key2','key3']};我在一次采访中得到了这个问题。现在我想在对象中添加一些新数据。2无论何时添加到对象中,都应在该主对象内的数组中更新“key_”(添加了key number)。 输出应该是这样的(你可以使用任何方法/函数/循环来更新它.

  • 我有一个带有 RestAssured 的测试自动化宠物项目,我想让它在架构上开发,以便使代码可重用,测试脚本易于阅读。我有表示API的请求和响应的类,我也有DTO类。例如,下面是一个与终结点一起使用的类: 如您所见,有一个父类< code > EndpointTechnicalSteps ,我想用它来处理来自endpoint的响应。例如,我想在< code > endpoint technical

  • 我需要创建一个对象(银行),其中包含一组客户端和bankID。我的问题是,我不知道如何在主函数中创建银行。 银行类别: 客户端类: 主要类别: 这些是问题所在: 你必须创建一个程序来模拟银行活动。该系统包括以下模块:银行—客户(客户数组)— idBank(字符串)5 BancAccount — accountNumber(字符串)—金额(浮点)客户—姓名(字符串)—地址(字符串)—账户(银行账户数

  • 问题内容: 假设您有一个非常简单的数据结构: …并且您想将其中一些存储在javascript变量中。如我所见,您有三个选择: 如果您要存储(或希望可能拥有)多个“价值”部分(例如,增加他们的年龄等),显然第二或第三种选择是可行的,因此,为了论证,让我们假设在此结构中再也不需要任何数据值了。您选择哪一个,为什么? 编辑 :该示例现在显示最常见的情况:非顺序ID。 问题答案: 每个解决方案都有其用例。