2011-11-23 8 views
11

可能性の重複:
Is Chrome's JavaScript console lazy about evaluating arrays?Chrome、Firefox、Safariのjavascriptオブジェクトのコンソールに表示される値が異なるのはなぜですか?

このJavaScriptを考えてみましょう:FirefoxのFirebugので

var foo = {bar : 1111}; 
console.log(foo); 
console.log(foo.bar); 

foo.bar = 2222; 
console.log(foo); 
console.log(foo.bar); 

を、これは私が期待しているだろうかを示しています。

Object { bar=1111} 
1111 

Object { bar=2222} 
2222 

しかし、SafariやChromeのコンソールで、それは示しています。印刷ダンプが、正しい値が特定の属性が印刷されている場合ときつまり

Object { bar=2222} 
1111 

Object { bar=2222} 
2222 

を、オブジェクトはコンソールで間違った属性を示しています。

これはブラウザのクールな機能ですか?またはオブジェクト指向のJavaScriptの基本的な側面私は行方不明ですか?

+2

私は推測していた場合、私は、デバッガが最初のもののためにメモリ内のオブジェクトへの参照を格納し、2つ目の値そのものだと思います。コードが参照を更新するので、監視されているデバッガの値も更新されます。全体的な野生の推測。 –

+2

SafariとChromeがJavaScriptを最適化し、foo.barへの割り当てを元のオブジェクト定義と組み合わせてから、2つのconsole.logステートメントのfoo.barの期待値をインライン展開することを推測してください。 –

+1

ありがとうマイクとジョン。これはそうではないと思われます。 私の目では、これはSafariとChromeがデバッグしようとしている間私のコードについて私に嘘を言っているということです!実行中にコードの2つのポイントにオブジェクトに含まれるものがすばやく表示されるようにするには、SafariとChromeで実際の表現ができません。 おそらく、私のデバッグルーチンは洗練されていないかもしれませんし、コードの中の手動console.log行に頼ってはいけませんか? –

答えて

21

Chrome(WebKit、Safariでも可)では、オブジェクト引数を使用してconsole.log呼び出しがオブジェクト参照を記録します。オブジェクトタブをクリックして開くと、内部は一定のままです(おそらくソートのキャッシュ)、最初に参照されたオブジェクトにはもはや関連しません(後でオブジェクトが変更された場合、反映されません)。しかし、その時点までオブジェクトは「キャッシュされていません」のままです。したがって、オブジェクトを複数回ログに記録した後、ログに記録された各オブジェクトを開くと、それらのオブジェクトはすべてメモリ内の同じオブジェクトを指します。その値は最新のものです。

これはよく知られている "問題"ですが、動作は設計上の決定(最初のリンクのコメントを参照)の結果であるため、開発チームはバグとはみなされません。

簡単な回避策は、オブジェクトの非オブジェクト値を取得する手段であり、任意のシリアル化メソッド(例:console.log(JSON.stringify(foo));)です。

https://bugs.webkit.org/show_bug.cgi?id=35801
http://code.google.com/p/chromium/issues/detail?id=44720
http://code.google.com/p/chromium/issues/detail?id=50316

+0

ウェブキットのバグ:https://bugs.webkit.org/show_bug.cgi?id=35801 –

+0

ありがとうございました。それは、ファイヤーバグを使用していないために私のために役立つと思います! –

+0

さて、私はそれはちょっと不自由なことに同意する必要があります。それは 'console.log'を完全にトレースするのに役に立たなくします。しかし、私はあなたがそのようなもののための伝統的なデバッガを使用することができたと思います。 –

関連する問題