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()应该被用来获取像数组和对象的原型等更多的信息。