17

重複の可能性:
ChromeのJavaScriptコンソールは配列の評価に怠惰ですか?

私はjavascriptに次のスニペットを持っていますが、その出力は何かがうまくいかないように感じさせます。

1.

a=2;
console.log(a);
a+=2;
console.log(a);

出力:2 4 ; 予想通り

2.

t=[0,2];
console.log(t);
t[0]+=2;
console.log(t);

出力:[2,2] [2,2]

出力はすべきではありません か?そして、両方のケースで異なる答えをもたらす上記の2つのケースの違いは何ですか?[0,2] [2,2]

4

4 に答える 4

17

これは、Chromeがログを実行する時間があるまで(つまり、スクリプトがCPUを解放するまで)ログが遅延するためです。

何が起こるかを理解するためにこれを試してください:

var t=[0,2];
console.log(t);
setTimeout(function() {
     t[0]+=2;
   console.log(t);
}, 1000);

それはあなたが期待するものを出力します。

それはChromeのバグですか?多分最適化の副作用。少なくともそれは危険なデザインです...

なぜ違いがあるのですか?Chromeは、ログに記録する必要があるものを、最初のケースではプライマリ(不変)値として、最後のケースでは配列へのポインターとして一時的に保存すると思います。

于 2012-06-26T19:21:17.410 に答える
7

chrome / ffのconsole.logは非同期であり、ログに記録されたオブジェクトは展開時に解釈されます。。代わりに、その時点での値を確認したい場合は、オブジェクトのコピーを作成します(配列の場合)。

t=[0,2];
console.log(t.slice(0));
t[0]+=2;
console.log(t);

配列の場合、.sliceを呼び出すと配列が複製され、参照は作成されません。タイムアウトを使用することはお勧めしません。これは実際には問題を解決せず、一時的に回避するだけです。

于 2012-06-26T19:27:45.127 に答える
0

あなたがしていることはすべて正しいですが、chromeのロギングは厄介/遅延しています。変数のコピーを作成してそれに追加してみると、コードが正しいことがわかります。

于 2012-06-26T19:24:34.100 に答える
0

新しいバージョンではChromeのログ記録が遅れますが、問題はありません。変数のコピーを作成するか、を使用しますsetTimeout

于 2012-06-26T19:36:07.717 に答える