Chromeではconsole
オブジェクトは同じことをするように見える2つのメソッドを定義します。
console.log(...)
console.dir(...)
dir
はログに記録する前にオブジェクトのコピーを取得するのですが、log
はコンソールへの参照を渡すだけなので、ログに記録されたオブジェクトを調べるときには変更されている可能性があります。しかし、いくつかの予備テストでは違いがないことと、ログに記録されたときとは異なる状態のオブジェクトを表示する可能性があることを示しています。
Chromeコンソールでこれを試してください(Ctrl+Shift+J)私が何を言っているのか見るために:
> o = { foo: 1 }
> console.log(o)
> o.foo = 2
ここで、logステートメントの下にある[Object]
を展開し、値が2のfoo
を表示していることに注意してください。dir
の代わりにlog
を使用して実験を繰り返す場合も同様です。
私の質問は、どうしてこれら二つの一見同じような関数がconsole
に存在するのでしょうか?
Firefoxでは、これらの関数はまったく異なる動作をします。log
はtoString
表現のみを出力しますが、dir
はナビゲーション可能なツリーを出力します。
Chromeでは、log
はすでにほとんどの場合 - ツリーを出力します。ただし、Chromeのlog
は、プロパティを持っていても、オブジェクトの特定のクラスを文字列化します。最も明確な違いの例は、おそらく正規表現です。
> console.log(/foo/);
/foo/
> console.dir(/foo/);
* /foo/
global: false
ignoreCase: false
lastIndex: 0
...
また、通常のオブジェクトとは異なるlog
で配列されている配列(console.dir([1,2,3])
など)との明らかな違いもわかります。
> 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オブジェクトも異なる振る舞いを示します 別の答えで述べたように 。
Chromeには、DOM要素をコンソールに送信するときにも便利な違いがあります。
通知:
console.log
はHTMLのようなツリーで要素を出力しますconsole.dir
はJSON風のツリーで要素を出力します特にconsole.log
はDOM要素に特別な扱いをしますが、console.dir
はしません。これはDOM JSオブジェクトの完全な表現を見ようとするときにしばしば役に立ちます。
この機能およびその他の機能については、 ChromeコンソールAPIリファレンス に詳しい情報があります。
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));
次のように.toString()バージョンの代わりにクリックスルー可能なブラウズ可能オブジェクトを出力するには、console.dir()を使用します。
console.dir(obj/this/anything)
Firebugサイトから http://getfirebug.com/logging/
Console.dir(object)を呼び出すと、> DOMタブのミニチュア版のように、オブジェクトのプロパティの対話型リストが記録されます。
Felix Klingsのアドバイスに従って、私は自分のクロムブラウザで試した。
console.dir([1,2])は、次のように出力されます。
Array [2]
:1
1:2
長さ:2
_proto_:Array [0]
While console.log([1,2])は、以下のように出力されます。
[1、2]
そのため、配列やオブジェクトのプロトタイプなどの詳細情報を取得するには、console.dir()を使用する必要があります。