どのようにしてconsole.logにオブジェクトの現在の状態を表示させることができますか?


146

アドオンのないSafari(実際には他のほとんどのブラウザー)では、呼び出されたconsole.logときの状態ではなく、最後の実行状態でオブジェクトが表示console.logされます。

console.logその行のオブジェクトの状態を取得するには、オブジェクトを複製して出力する必要があります。

例:

var test = {a: true}
console.log(test); // {a: false}
test.a = false; 
console.log(test); // {a: false}

2
jsfiddleの問題の例と以下に示すさまざまな解決策:jsfiddle.net/luken/M6295
ルーク

7
log関数がオブジェクトへのライブ参照を出力することは非常に直感的ではありません。これはウォッチと呼ばれ、ログエントリとは大きく異なります。オブジェクトをログに記録する場合、プリミティブ値を格納する変数をログに記録する場合よりも、これを行うことには意味がありません。
かすかな信号2016

2
これまでにこれまでにいくつかの経験はありませんか?私はこの恐ろしいものを見つけました
ErikAGriffin

回答:


171

あなたが探していると思いますconsole.dir()

console.log()オブジェクトへの参照を出力し、オブジェクトを開くときに変更されるため、意図したとおりに動作しません。console.dir呼び出し時にオブジェクトのプロパティのディレクトリを出力します。

以下のJSONのアイデアは良いものです。さらに、JSON文字列を解析して、.dir()が提供するような参照可能なオブジェクトを取得することもできます。

console.log(JSON.parse(JSON.stringify(obj)));


38
Chrome13の私にとって、との間に違いはconsole.logありませんconsole.dir
Andrew D.

うーん、それは驚くべきことです。Firebugで動作します。Webkitでも同じだと思っていました。
evan

1
Chromeで表示されるのは、ログステートメントの実行後にコンソールを開くと、展開すると遅延評価が行われるということです。しかし、コンソールが既に開いている場合(たとえば、コンソールを開いてからページの更新を押すなど)、熱心な評価が行われます。つまり、ログステートメントが実行されたときの値が出力されます。
Polemarch 2014年

6
また、dirは、シャローコピーがディープコピーになるのと同じようにJSONになります。console.dir()は最上位のオブジェクトのプロパティのみを評価します(他の深くネストされたオブジェクトは評価されません)が、JSONは再帰的に実行されます。
Polemarch 2014年

9
同様に、私にとってconsole.dirはChrome(v33)では動作しません。ここに人々が提供したソリューションの比較があります:jsfiddle.net/luken/M6295
ルーク

71

それがログに記録されたときの状態を確認したい場合に私が通常行うことは、JSON文字列に変換することです。

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

4
すばらしい、それは私にとって良いヒントでした。オブジェクトをコンソールに表示するには、もう一度解析する必要がありました。 function odump(o){ console.log($.parseJSON(JSON.stringify(o))); }
Chris

1
これは私にとってうまくいきました!console.dirはそれを印刷しませんでした
ah-shiang han

1
オブジェクトに循環構造が含まれている場合はどうなりますか?
Alex McMillan

1
@AlexMcMillan 循環参照を持つオブジェクトのJSON文字列化を可能にするいくつかのライブラリの1つ 使用できます。
Alex Turpin 2014

7
もう。これは、実行できるようにするための単純で明白なことです。代わりに、文字列化、解析、ログ記録を行い、特別な循環参照ライブラリを使用する必要があります!?!ブラウザーは、単純なデバッグのニーズをサポートするためにより良い仕事をする必要があると思います。
Mars

26

バニラJS:

@evanの答えがここにあるようです。JSON.parse / stringifyを(ab)使用して、オブジェクトのコピーを効果的に作成します。

console.log(JSON.parse(JSON.stringify(test)));

jQuery固有のソリューション:

あなたは特定の時点でオブジェクトのスナップショットを作成することができます jQuery.extend

console.log($.extend({}, test));

ここで実際に起こっていることは、jQueryがtestオブジェクトのコンテンツを使用して新しいオブジェクトを作成し、それをログに記録することです(そのため、オブジェクトは変更されません)。

AngularJS(1)固有のソリューション:

Angularはcopy同じ効果に使用できる関数を提供します:angular.copy

console.log(angular.copy(test));

バニラJSラッパー関数:

これは、ラップするconsole.logがログアウトする前にオブジェクトのコピーを作成する関数です。

これは、回答の中のいくつかの類似しているが堅牢ではない関数への応答としてこれを書いたものです。これは、複数の引数をサポートし、なりませんそうでない場合は、物事をコピーしようと定期的なオブジェクト。

function consoleLogWithObjectCopy () {
  var args = [].slice.call(arguments);
  var argsWithObjectCopies = args.map(copyIfRegularObject)
  return console.log.apply(console, argsWithObjectCopies)
}

function copyIfRegularObject (o) {
  const isRegularObject = typeof o === 'object' && !(o instanceof RegExp)
  return isRegularObject ? copyObject(o) : o
}

function copyObject (o) {
  return JSON.parse(JSON.stringify(o))
}

使用例consoleLogWithObjectCopy('obj', {foo: 'bar'}, 1, /abc/, {a: 1})


6

ことは> Object、コンソールでは、現在の状態のみを示していません。実際には、展開するまでオブジェクトとそのプロパティの読み取りは延期されます。

例えば、

var test = {a: true}
console.log(test);
setTimeout(function () {
    test.a = false; 
    console.log(test);
}, 4000);

次に、最初の呼び出しを展開します。2番目の呼び出しconsole.logが戻る前に行うと、正しくなります。


2

Xeon06のヒントを使用して、オブジェクト内の彼のJSONを解析できます。これが、オブジェクトをダンプするために使用するログ関数です。

function odump(o){
   console.log($.parseJSON(JSON.stringify(o)));
}

1

私はユーティリティを定義しました:

function MyLog(text) {
    console.log(JSON.stringify(text));
}

コンソールにログオンする場合は、次のようにします。

MyLog("hello console!");

とてもうまくいきます!



1

デバッガライブラリを使用するオプションがあります。

https://debugjs.net/

スクリプトをWebページに含めて、ログステートメントを入力するだけです。

<script src="debug.js"></script>

ロギング

var test = {a: true}
log(test); // {a: true}
test.a = false; 
log(test); // {a: false}

0

私はこれを示唆するために撃たれるかもしれませんが、これはさらに一歩踏み出すことができます。コンソールオブジェクト自体を直接拡張して、より明確にすることができます。

console.logObject = function(o) {
  (JSON.stringify(o));
}

これが時空の連続体である種のライブラリ衝突/核溶解/破裂を引き起こすかどうかはわかりません。しかし、それは私のqUnitテストで美しく機能します。:)


1
これは何も記録しません。何かを文字列化した結果を飲み込むだけです。面白い投票
Zach Lysobey

0

対象のページにリクエストを送信する前に、コンソールを開いた後にページを更新するか、コンソールを開いてください。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.