Pointyの答えには良い情報がありますが、この質問に対する正しい答えではありません。
OPによって記述された動作は、2010年3月に最初に報告され、2012年8月にWebkitにパッチが適用されたバグの一部ですが、この記事の執筆時点ではまだGoogleChromeに統合されていません。動作は、オブジェクトリテラルがに渡されたときにコンソールデバッグウィンドウが開いているか閉じconsole.log()
ているかによって異なります。
元のバグレポート( https://bugs.webkit.org/show_bug.cgi?id=35801 )からの抜粋:
説明ミッチクラマーから2010-03-0511:37:45PST
1)1つ以上のプロパティを持つオブジェクトリテラルを作成します
2)そのオブジェクトをconsole.logしますが、閉じたままにします(コンソールで展開しないでください)
3)プロパティの1つを新しい値に変更します
ここでそのconsole.logを開くと、生成された時点で値が異なっていたとしても、何らかの理由で新しい値が設定されていることがわかります。
開いた場合、それが明確でない場合は正しい値を保持することを指摘しておく必要があります。
Chromium開発者からの応答:
コメント#2 Pavel Feldman 2010-03-0906:33:36PSTから
これを修正するつもりはないと思います。オブジェクトをコンソールにダンプするときにクローンを作成することはできません。また、オブジェクトを常に実際のものにするために、オブジェクトのプロパティの変更をリッスンすることもできません。
ただし、既存の動作が期待されることを確認する必要があります。
多くの不満が続き、最終的にはバグ修正につながりました。
2012年8月に実装されたパッチの変更ログノート(http://trac.webkit.org/changeset/125174):
現在のところ、オブジェクト(配列)をコンソールにダンプすると、コンソールオブジェクトの展開時にオブジェクトのプロパティが読み取られます(つまり、遅延します)。これは、変更中に同じオブジェクトをダンプすると、コンソールを使用してデバッグするのが困難になることを意味します。
この変更により、ロギングの瞬間にオブジェクト/配列の簡略化されたプレビューの生成が開始され、この情報がフロントエンドに渡されます。これは、フロントエンドがすでに開かれている場合にのみ発生します。これは、console.log()に対してのみ機能し、ライブコンソールの相互作用に対しては機能しません。