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

JavaScript对象和console.log的怪异行为

华森
2023-03-14
问题内容

这段代码:

foo = [{id: 1},{id: 2},{id: 3},{id: 4}, {id: 5}, ];
console.log('foo1', foo, foo.length);
foo.splice(2, 1);
console.log('foo2', foo, foo.length);

在Chrome中产生以下输出:

foo1 
[Object, Object, Object, Object, Object]  5
    0: Object
    1: Object
    2: Object
    3: Object
    length: 4
    __proto__: Array[0]
     5 (index):23
foo2 
[Object, Object, Object, Object]  4
    0: Object
    1: Object
    2: Object
    3: Object
    length: 4
    __proto__: Array[0]

这是为什么?


问题答案:

通过检查对象console.log以异步方式进行。控制台同步接收到对对象的引用,但在对象被扩展之前不会显示对象的属性(在某些情况下,取决于浏览器以及日志发生时是否打开了开发工具)。如果在控制台中检查对象之前已对其进行了修改,则显示的数据将具有更新的值。

例如,Chrome会i在一个方框中显示一点,悬停时说:

记录时左边的对象值已被快照,下面的值刚刚被评估。

让您知道您在看什么。

在这些情况下进行记录的一种技巧是记录各个值:

console.log(obj.foo, obj.bar, obj.baz);

或JSON编码对象引用:

console.log(JSON.stringify(obj));


 类似资料:
  • 如果我在chrome或firefox上直接将下面的代码运行到控制台中,在第一个日志中,value2的值在内联表示中是0,但是如果我展开表示检查整个对象,它显示为17。这是一个多浏览器的bug还是我在这里遗漏了javascript的一些东西?我在这里提出这个问题的原因是,这种行为发生在不同的浏览器上,这使我认为语言或函数中存在某种我没有意识到的漏洞。 实际代码: 在MacOS Catalina和两种

  • 问题内容: 我有这个非常简单的课程: 在类路径中指定的此上下文文件不存在。我几乎可以输入任何想要的名称,并且代码不会中断。我的意思是测试运行正常,就好像该文件确实存在。 如果我从: classpath 到 classpath* 做了一个小的更改,它会发出喙,表示该文件不存在,这也是我在第一种情况下的预期行为。 春季版本3.2.3。 有人可以解释这种奇怪的行为吗? 编辑 建议的日志内容: 我什至尝试

  • 问题内容: 有什么方法可以影响console.log提供的自定义对象吗?我试图覆盖customObject.prototype.toString方法,但这没有用。 有任何想法吗? 问题答案: 在node.js中,调用每个参数时不使用格式占位符。因此,如果在对象上定义方法,则将调用该方法以获取对象的自定义字符串表示形式。 例如: 输出: foo = BAR 或使用课程:

  • 问题内容: 下面的代码将控制台日志打印到页面上。它记录来自服务器的获取和响应,例如: 与其将这些内容显示在页面上,我不希望计算每个响应和请求,因此您会看到一个从1开始到结束为止的数字,可以是任何数字。这是为了向用户显示正在发生的事情,而没有向他们显示所有响应并获取数据。 和html: 问题答案: 如果您只想覆盖以打印响应计数,则应该这样做,但这将增加任何呼叫的计数。 如果您希望依靠响应而不是所有控

  • 给予 尽管让的构造函数调用(http://mongodb.github.io/node-mongoDb native/2.2/api/objectid.html#.isvalid),但它会出现错误: 结果: 为什么如果是的实例,那么没有在其上定义呢?

  • 问题内容: 我已经在Firefox-3.5.7 / Firebug-1.5.3和Firefox-3.6.16 / Firebug-1.6.2中观察到了这一点 当我启动Firebug时: 这里发生了什么?这是一个错误,还是我误会了如何使用? 问题答案: 看来第一个例子 用未定义的指针创建一个数组。 第二个对象创建一个带有指向3个未定义对象的指针的数组,在这种情况下,它们自身的指针不是未定义的,只有它