console.dir 和 console.log 有什么区别?

IT技术 javascript google-chrome console
2021-01-24 04:06:29

在 Chrome 中,console对象定义了两个似乎做同样事情的方法:

console.log(...)
console.dir(...)

我在网上某处阅读dir了在记录之前获取对象副本的内容,而log只是将引用传递给控制台,这意味着当您检查记录的对象时,它可能已更改。然而,一些初步测试表明没有区别,并且它们都可能显示处于与记录时不同状态的对象。

在 Chrome 控制台 ( Ctrl+ Shift+ J) 中试试这个,看看我的意思:

> o = { foo: 1 }
> console.log(o)
> o.foo = 2

现在,展开[Object]log 语句下方的内容并注意它显示foo的值为 2。如果您使用dir代替重复实验,情况也是如此log

我的问题是,为什么这两个看似相同的功能存在于console

6个回答

在 Firefox 中,这些函数的行为完全不同:log只打印出一个toString表示,而dir打印出一个可导航的树。

在 Chrome 中,log已经打印出一棵树——大部分时间然而,Chromelog仍然对某些类的对象进行字符串化,即使它们具有属性。也许最明显的差异示例是正则表达式:

> console.log(/foo/);
/foo/

> console.dir(/foo/);
* /foo/
    global: false
    ignoreCase: false
    lastIndex: 0
    ...

您还可以看到与普通对象不同的数组(例如,console.dir([1,2,3])的明显区别log

> console.log([1,2,3])
[1, 2, 3]

> console.dir([1,2,3])
* Array[3]
    0: 1
    1: 2
    2: 3
    length: 3
    * __proto__: Array[0]
        concat: function concat() { [native code] }
        constructor: function Array() { [native code] }
        entries: function entries() { [native code] }
        ...

DOM 对象也表现出不同的行为,如另一个答案所述

@icedwater:取决于您在调用时是否console.log打开控制台或稍后打开它。对真的。:-)
2021-03-17 04:06:29
您还可以看到与 Function 的明显区别。在 chrome 中,它会使用 打印函数源代码console.log,但是使用console.dir,您可以看到prototype,arguments属性。
2021-04-08 04:06:29
目前看来,console.logconsole.dir实际在返回同样表示[1,2,3]在Firefox。
2021-04-08 04:06:29
不要忘记 console.dir 保留对对象的引用。您可能不想在生产中广泛使用它。它可能仅在显示控制台时才有效。
2021-04-09 04:06:29
在 Ubuntu 上的 Chromium 45 中,console.log似乎是简化的“Firefox”版本,看起来像toString一棵树而不是一棵树。我不确定他们什么时候改变了它,但他们做到了。
2021-04-12 04:06:29

将 DOM 元素发送到控制台时,Chrome 中存在另一个有用的区别。

注意:

  • console.log 在类似 HTML 的树中打印元素
  • console.dir 在类似 JSON 的树中打印元素

具体来说,console.log对 DOM 元素进行特殊处理,而console.dir没有。当试图查看 DOM JS 对象的完整表示时,这通常很有用。

Chrome 控制台 API 参考中有关于此功能和其他功能的更多信息

明白了,这就是我最初的想法,但后来想到为什么他们会从这里复制。说得通 。好资料
2021-03-13 04:06:29
@DrewNoakes 传奇。StackOverflow 上的答案成为官方参考的那一刻。哈哈😂
2021-03-14 04:06:29
2021-03-22 04:06:29
@loneshark99 实际上是相反的。注意到他们截图中的 URL 了吗?他们复制了我的答案。但这没关系,因为 SO 答案上的许可证允许这样做,无论如何我都喜欢 MDN。
2021-03-25 04:06:29
@DrewNoakes 难道他们不应该至少相信你,即使 SO 实践了“一切为了争夺”许可证?
2021-04-01 04:06:29

我认为 Firebug 的做法与 Chrome 的开发工具不同。看起来 Firebug 为您提供了对象的字符串化版本,同时console.dir为您提供了一个可扩展的对象。两者都为您提供了 Chrome 中的可扩展对象,我认为这可能是混淆的来源。或者这只是 Chrome 中的一个错误。

在 Chrome 中,两者都做同样的事情。扩展您的测试,我注意到当您扩展对象时,Chrome 会获取对象的当前值。

> o = { foo: 1 }
> console.log(o)
Expand now, o.foo = 1
> o.foo = 2
o.foo is still displayed as 1 from previous lines

> o = { foo: 1 }
> console.log(o)
> o.foo = 2
Expand now, o.foo = 2

如果这是您想要看到的,您可以使用以下内容来获取对象的字符串化版本。这将显示在调用此行时对象是什么,而不是在展开它时。

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

使用 console.dir() 输出一个可浏览的对象,您可以点击它而不是 .toString() 版本,如下所示:

console.dir(obj/this/anything)

如何在 Chrome 控制台中显示完整对象?

来自萤火虫网站 http://getfirebug.com/logging/

调用 console.dir(object) 将记录一个对象属性的交互式列表,例如 > DOM 选项卡的微型版本。