1. ホーム
  2. javascript

[解決済み] ChromeのJavaScriptコンソールは、オブジェクトの評価を怠るのか?

2022-04-28 11:37:36

質問

まずはコードから。

var s = ["hi"];
console.log(s);
s[0] = "bye";
console.log(s);

シンプルでしょう?これに対して、Firefoxのコンソールはこう言います。

[ "hi" ]
[ "bye" ]

すばらしいが、ChromeのJavaScriptコンソール(7.0.517.41 beta)にはこう書かれている。

[ "bye" ]
[ "bye" ]

それとも、ChromeのJavaScriptコンソールが、私の配列の評価について例外的に怠慢なのでしょうか?

解決方法は?

tecさん、コメントありがとうございます。 この問題を説明する既存の未確認のWebkitのバグを見つけることができました。 https://bugs.webkit.org/show_bug.cgi?id=35801 (編集: 現在は修正されています!)

どの程度のバグなのか、修正可能なのかについては議論があるようです。 私には、悪い行動のように思えます。 少なくともChromeでは、コンソールを開いていても、ページが更新されるとすぐに(ページが読み込まれる前に)実行されるスクリプトにコードが存在する場合に発生するので、特に困りました。 コンソールがまだアクティブでないときに console.log を呼び出すと、キューに入れられたオブジェクトへの参照が発生するだけで、コンソールに含まれる出力は発生しません。 したがって、コンソールの準備が整うまで、配列(または任意のオブジェクト)は、評価されません。 これは、まさに遅延評価のケースです。

しかし、あなたのコードでこれを回避する簡単な方法があります。

var s = ["hi"];
console.log(s.toString());
s[0] = "bye";
console.log(s.toString());

toStringを呼び出すことで、次のステートメントによって変更されない表現をメモリ上に作成し、コンソールが準備できたときにそれを読み込むことができます。 コンソールの出力は、オブジェクトを直接渡すのとは少し違いますが、許容範囲だと思われます。

hi
bye