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

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

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

我在网上读了一些地方, dir在logging之前需要一个对象的副本,而log只是将引用传递给控制台,这意味着当你去检查你logging的对象时,它可能已经改变了。 然而,一些初步的testing表明,没有什么区别,它们都有可能在不同的状态下显示对象,而不是在被logging的时候。

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

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

现在,展开log [Object]下面的[Object] ,注意它显示foo的值为2.如果使用dir而不是log重复实验,情况也是如此。

我的问题是,为什么console存在这两个看似相同的function?

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

在Chrome中, 大多数情况下log已经打印出一棵树。 不过,Chrome的log仍然会将特定类别的对象串起来,即使它们具有属性。 或许最明显的差异是正则expression式:

 > 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对象也performance出不同的行为。

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

注意:

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

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

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

我认为Firebug的做法与Chrome的开发工具不同。 它看起来像Firebug给你一个string版本的对象,而console.dir给你一个可扩展的对象。 Chrome在Chrome中都给了你可扩展的对象,我认为这也是困惑的来源。 或者这只是Chrome中的一个错误。

在Chrome中,两者都做同样的事情。 扩大你的testing,我已经注意到,当你展开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 

如果你想看到的话,你可以使用下面的代码来获得对象的string版本。 这会告诉你在调用这一行时对象是什么,而不是当你展开它时。

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

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

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

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

 console.dir(obj/this/anything) 

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

按照Felix Klings的build议,我在我的Chrome浏览器中尝试过。

console.dir([1,2])给出以下输出:

arrays[2]

0:1

1:2

长度:2

_ proto _:Array [0]

console.log([1,2])给出以下输出:

[1,2]

所以我相信console.dir()应该被用来获取像数组和对象的原型等更多的信息。