[解決済み] console.log()は、実際に値が変化する前に変数の変化した値を表示する。
質問
このコードの断片は理解できました。Aのコピーを作り、それをCと呼びます。Aを変更してもCは同じままです。
var A = 1;
var C = A;
console.log(C); // 1
A++;
console.log(C); // 1
しかし、Aが配列である場合、異なる状況になります。Cが変更されるだけでなく、Aに触れる前に変更されます。
var A = [2, 1];
var C = A;
console.log(C); // [1, 2]
A.sort();
console.log(C); // [1, 2]
2番目の例で何が起こったのか、誰か説明してください。
どのように解決するのですか?
とんがり屋の答え は良い情報を持っていますが、この質問に対する正しい答えではありません。
OP が説明した動作は、2010 年 3 月に最初に報告され、2012 年 8 月に Webkit 用のパッチが適用されたバグの一部ですが、この記事を書いている時点ではまだ Google Chrome に統合されていません。この動作は、コンソール デバッグ ウィンドウが
オープン
または
クローズド
に渡された時点で、オブジェクトリテラルは
console.log()
.
元のバグレポートからの抜粋 ( https://bugs.webkit.org/show_bug.cgi?id=35801 ):
説明文 From mitch kramer 2010-03-05 11:37:45 PST
1) 1つまたは複数のプロパティを持つオブジェクトリテラルを作成します。
2) そのオブジェクトをconsole.logするが、閉じたままにする(コンソールで展開しない)
3) プロパティの1つを新しい値に変更します。
ここでconsole.logを開くと、生成時に異なる値だったにもかかわらず、何らかの理由で新しい値になっていることがわかります。
もしそれが明確でなかったなら、それを開くと正しい値が保持されることを指摘しておきます。
Chromium 開発者からの回答です。
コメント #2 Pavel Feldman さんより 2010-03-09 06:33:36 PST
この問題は解決されないと思います。コンソールにダンプする際にオブジェクトをクローンすることはできませんし、オブジェクトのプロパティの変更をリッスンして、常に実際のオブジェクトを作成することもできません。
しかし、私たちは既存の動作が期待されるものであることを確認する必要があります。
多くの不満が噴出し、最終的にはバグフィックスにつながりました。
2012年8月に実装されたパッチのチェンジログノート( http://trac.webkit.org/changeset/125174 ):
本日より、オブジェクト(配列)をコンソールにダンプすると、オブジェクトのプロパティがコンソールオブジェクトの展開時に読み込まれるようになります。 コンソールのオブジェクト展開時に読み込まれます。つまり、同じオブジェクトをダンプしながら をダンプすることは、コンソールを使用してデバッグするのが難しいことを意味します。
この変更により、オブジェクト/配列のロギング時に省略されたプレビューを生成するようになりました。 を生成し、この情報をフロントエンドに渡します。これは、フロントエンドがすでに開かれているときにのみ発生します。 がすでに開かれているときにのみ発生し、コンソールのライブインタラクションではなく console.log() のためにのみ動作します。
関連
-
[解決済み] console.dirとconsole.logの違いは何ですか?
-
[解決済み] Node.js の console.log() で '[Object]' ではなく、完全なオブジェクトを取得するにはどうすればよいですか?
-
[解決済み] Pythonの変数名や関数名の命名規則について教えてください。
-
[解決済み] Pythonのシングルアンダーコア"_"変数の目的は何ですか?
-
[解決済み] MySQLのことです。変数 vs. 変数。その違いは何ですか?
-
[解決済み】関数の前のエクスクラメーションマークは何をするのですか?
-
[解決済み] JavaScriptで次の要素/前の要素を取得しますか?
-
[解決済み] <Enter>でjQuery UIダイアログを送信する
-
[解決済み] JavaScriptで文字列を数値に変換する最速の方法は何ですか?
-
[解決済み] Javascript / jQueryでAndroid端末を検出する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] チェックボックスが選択されているかどうかを確認するjQuery
-
[解決済み] なぜJavaScriptでは!{}[true]がtrueに評価されるのですか?
-
[解決済み] 文字列がすべて同じ部分文字列で構成されているかどうかを調べるにはどうすればよいですか?
-
[解決済み] JavaScriptで、ある文字列が別の文字列の中に出現するすべてのインデックスを見つけるにはどうすればよいですか?
-
[解決済み] JavaScriptのtoString()関数をオーバーライドして、デバッグ用に意味のある出力を提供することは可能でしょうか?
-
[解決済み] jQueryの$という記号の意味は何ですか?
-
[解決済み] javascript includes() 大文字小文字を区別しない
-
[解決済み] moment.jsでミュータビリティを回避するには?
-
[解決済み] $.ajax実行中にローディングイメージを表示する
-
[解決済み] JavaScriptの文字列プリミティブとStringオブジェクトの違いは何ですか?