2012-03-16 9 views
0

私は全く理解できない何かに気付きました。私は、コンソールログを期待するJavascript配列ロギングの混乱

var a = [1,2,3]; 

console.log(a.push(4)); 
console.log(a); 
console.log(a.push(5)); 

:私はJavaScriptで本当に簡単な何かをやっている4[1,2,3,4]、および5を例えばhereを説明しました。 キャッチは、実際のコンソール出力は次のように見えることである:4[1,2,3,4,5]、および5

参照:http://jsfiddle.net/HknMF/

地球上で何が5は、2番目のログ出力に表示されるのですか?あなたはそれとオブジェクトを調べるときに、一部のブラウザでは、コンソールは、配列/オブジェクトへの参照を使用していますhttp://i.imgur.com/fwAK3.png

+1

本当ですか?私はjsfiddleであなたのコードを実行しようとしましたが、コンソールの出力は期待どおりです...私はFirefox 10.0.2です。どのブラウザを使用していますか? – Hery

+0

@Hery yes確かに、私はChromeとFirefox(Firebug付き)で試しました。どのようなコンソールを使用していますか?火かぶりすぎる? – m90

+0

はい、ファイヤーバグ1.9.1 – Hery

答えて

4

EDIT:ここFWIWは、両方の挙動を示すFirebugののスクリーンショットですconsole.log()コールの後に変更された場合、変更されたオブジェクトが表示されます。 Firefoxので

これは、オブジェクトのためではなく、とにかくインラインで表示されているアレイ用起こる:(

>>> var a = [1,2,3]; console.log(a.push(4)); console.log(a); console.log(a.push(5)); 
4 
[1, 2, 3, 4] 
5 

特に迅速な回避策はどちらかであるそれらをクローニング機能が含まれていないオブジェクトに対してあなたが持っている場合は$.extend({}, yourObject)を記録jQuery)またはJSON文字列バージョンをログに記録します(素晴らしいオブジェクトビューを失い、単純な文字列を取得します)。配列は簡単に複製できます(浅いコピー!)a.slice(0)

+0

どのブラウザがこれを行うのですか? – GoldenNewby

+0

多くのことが説明されていますが、配列の現在の状態をログに記録する方法はありますか? – m90

+1

'JSON.stringify()'またはクローンしてください( 'a.slice(0)') – ThiefMaster

1

ライブの配列(Chrome)または文字列表現(Firefox)のどちらかに依存します。

これを防ぐには浅いコピーで十分です。使用:

console.log(a.slice(0));