2012-08-14 95 views
256

在Chrome瀏覽器中console對象定義了兩個方法,似乎做同樣的事情:console.dir和console.log有什麼區別?

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

我聽說網上說dir拍攝對象的副本記錄之前,而log只是傳遞的參考控制檯,這意味着當你去檢查你記錄的對象時,它可能已經改變了。然而,一些初步測試表明,沒有任何區別,並且它們都有可能在不同狀態下顯示對象,而不是在它們被記錄時。

在Chrome控制檯試試這個(按Ctrl + + Ĵ),看看我的意思是:

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

現在,展開[Object]日誌語句下面,請注意,顯示foo,值爲2.如果使用dir而不是log重複實驗,情況也是如此。

我的問題是,爲什麼這兩個看似相同的函數存在於console

+51

嘗試'console.log([1,2])'和'console.dir([1,2])',你會看到區別。 – 2012-08-14 14:25:02

+0

在firebug中,用'console.dir'記錄的對象內容不會改變,所以它有很大的不同。 – 2013-07-26 09:53:16

+3

請小心'console.dir()':此功能是[非標準](https://developer.mozilla.org/docs/Web/API/Console/dir)!因此,請勿將其用於生產;) – fred727 2015-09-10 07:33:35

回答

245

在Firefox中,這些功能的行爲完全不同:log只打印出toString表示,而dir打印出一個瀏覽樹。

在Chrome中,log已經打印出一棵樹 - 大部分時間爲。但是,Chrome的log仍然將特定類別的對象串起來,即使它們具有屬性。也許的差的最明顯的例子是一個正則表達式:

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

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

還可以看到與陣列明顯的差異(例如,console.dir([1,2,3])),其log從正常對象GED不同:

> 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物體也表現出不同的行爲,as noted on another answer

+7

不要忘記console.dir保留對該對象的引用。你可能不想在生產中廣泛使用它。它可能只適用於顯示控制檯。 – 2013-05-08 15:08:41

+0

在Ubuntu上的Chromium 45中,'console.log'似乎是簡化的「Firefox」版本,看起來像是一個'toString'而不是一棵樹。我不確定他們什麼時候改變它,但他們確實如此。 – icedwater 2015-11-15 08:55:02

+1

@icedwater:取決於您在調用console.log時是否打開控制檯或稍後打開它。對真的。 :-) – 2017-06-22 17:12:27

2

從螢火蟲網站 http://getfirebug.com/logging/

調用console.dir(對象)將記錄一個對象的屬性的交互式上市,像>的DOM選項卡的微縮版。

4

我認爲螢火蟲與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)); 
0

繼Felix Klings的建議之後,我在我的Chrome瀏覽器中試用了它。

console.dir([1,2])給出以下輸出:

陣列[2]

0:1

1:2

長度:2

_ _:數組[0]

雖然的console.log([1,2])給出以下輸出:

[1,2]

所以我認爲應該使用console.dir()來獲取像數組和對象中的原型等更多信息。

100

將DOM元素髮送到控制檯時,Chrome中存在另一個有用的差異。

說明:

  • console.log打印在HTML狀樹中的元件
  • console.dir打印在一類JSON樹

具體的元件,console.log給出DOM元素的特殊處理,而console.dir沒有。當試圖查看DOM JS對象的完整表示時,這通常很有用。

有關此功能和其他功能的更多信息,請參閱Chrome Console API reference

+0

我相信這個信息是從https://developer.mozilla.org/en-US/docs/Web/API/Console/log – loneshark99 2018-02-20 18:18:05

+0

@ loneshark99實際上是相反的。注意截圖中的URL?他們複製我的答案。但是,這很好,因爲這是答案允許的SO答案,我愛MDN。 – 2018-02-20 19:35:33

+0

明白了,這就是我最初的想法,但後來想到他們爲什麼要從這裏複製。說得通 。好信息 – loneshark99 2018-02-20 19:37:12