1. ホーム
  2. javascript

[解決済み] console.log()は、実際に値が変化する前に変数の変化した値を表示する。

2023-02-25 16:43:53

質問

このコードの断片は理解できました。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() のためにのみ動作します。