Saya akan mulai dengan kode:
var s = ["hi"];
console.log(s);
s[0] = "bye";
console.log(s);
Sederhana bukan? Menanggapi ini, Firebug mengatakan:
["hi"]
["bye"]
Luar biasa, tetapi konsol JavaScript Chrome (7.0.517.41 beta) mengatakan:
["bye"]
["bye"]
Apakah saya telah melakukan kesalahan, atau apakah konsol JavaScript Chrome terlalu malas mengevaluasi array saya?
javascript
arrays
logging
google-chrome
console
Eric Mickelsen
sumber
sumber
i
tooltip ikon biru mengatakan "Nilai di bawah baru saja dievaluasi".Jawaban:
Terima kasih atas komentarnya, tec. Saya dapat menemukan bug Webkit yang belum dikonfirmasi yang menjelaskan masalah ini: https://bugs.webkit.org/show_bug.cgi?id=35801 (EDIT: sekarang sudah diperbaiki!)
Tampaknya ada beberapa perdebatan mengenai seberapa banyak bug itu dan apakah itu dapat diperbaiki. Bagi saya, ini sepertinya perilaku yang buruk. Ini sangat mengganggu saya karena, setidaknya di Chrome, ini terjadi ketika kode berada dalam skrip yang dijalankan segera (sebelum halaman dimuat), bahkan ketika konsol terbuka, setiap kali halaman di-refresh. Memanggil console.log saat konsol belum aktif hanya menghasilkan referensi ke objek yang diantrekan, bukan keluaran yang akan dimuat di konsol. Oleh karena itu, array (atau objek apa pun), tidak akan dievaluasi hingga konsol siap. Ini benar-benar kasus evaluasi malas.
Namun, ada cara sederhana untuk menghindari hal ini di kode Anda:
Dengan memanggil toString, Anda membuat representasi dalam memori yang tidak akan diubah dengan pernyataan berikut, yang akan dibaca konsol ketika sudah siap. Output konsol sedikit berbeda dengan meneruskan objek secara langsung, tetapi tampaknya dapat diterima:
sumber
Dari penjelasan Eric, itu karena
console.log()
antrian, dan mencetak nilai selanjutnya dari array (atau objek).Ada 5 solusi:
sumber
Anda dapat mengkloning sebuah array dengan
Array#slice
:Fungsi yang dapat Anda gunakan sebagai ganti
console.log
yang tidak memiliki masalah ini adalah sebagai berikut:Untuk kasus objek, sayangnya, metode terbaik tampaknya men-debug terlebih dahulu dengan browser non-WebKit, atau menulis fungsi rumit untuk dikloning. Jika Anda hanya bekerja dengan objek sederhana, di mana urutan tombol tidak menjadi masalah dan tidak ada fungsi, Anda selalu dapat melakukan:
Semua metode ini jelas sangat lambat, jadi bahkan lebih daripada dengan metode normal
console.log
, Anda harus menghapusnya setelah Anda selesai debugging.sumber
Ini telah ditambal di Webkit, namun ketika menggunakan kerangka kerja React, ini terjadi pada saya dalam beberapa keadaan, jika Anda memiliki masalah seperti itu, gunakan saja seperti yang disarankan orang lain:
sumber
JSON.parse(JSON.stringify(event))
tidak mendapatkan kedalaman / akurasi yang tepat. Pernyataan debugger adalah satu-satunya solusi nyata yang saya temukan untuk mendapatkan wawasan yang benar.Ini sudah dijawab, tetapi saya akan membatalkan jawaban saya. Saya menerapkan pembungkus konsol sederhana yang tidak mengalami masalah ini. Membutuhkan jQuery.
Ini hanya mengimplementasikan
log
,warn
danerror
metode, Anda harus menambahkan lebih banyak agar dapat dipertukarkan dengan regulerconsole
.sumber
Sepertinya Chrome sedang mengganti dalam fase "pra-kompilasi" setiap instance "s" dengan pointer ke larik sebenarnya.
Salah satu cara mengatasinya adalah dengan mengkloning larik, sebagai gantinya mencatat salinan baru:
sumber
solusi terpendek sejauh ini adalah menggunakan sintaks array atau penyebaran objek untuk mendapatkan klon nilai yang akan dipertahankan seperti pada saat logging, yaitu:
Namun berhati-hatilah karena ini melakukan penyalinan yang dangkal, sehingga nilai non-primitif bersarang yang dalam tidak akan dikloning dan karenanya ditampilkan dalam status modifikasinya di konsol
sumber