console.log
tidak terstandarisasi, sehingga perilakunya agak tidak ditentukan, dan dapat diubah dengan mudah dari rilis ke rilis alat pengembang. Buku Anda sepertinya sudah ketinggalan zaman, begitu juga jawaban saya segera.
Untuk kode kami, tidak ada bedanya apakah console.log
async atau tidak, tidak menyediakan jenis panggilan balik atau lebih; dan nilai yang Anda berikan selalu direferensikan dan dihitung pada saat Anda memanggil fungsi tersebut.
Kami tidak benar-benar tahu apa yang terjadi kemudian (OK, kami bisa, karena Firebug, Chrome Devtools dan Opera Dragonfly semuanya open source). Konsol perlu menyimpan nilai yang dicatat di suatu tempat, dan itu akan menampilkannya di layar. Rendering pasti akan terjadi secara asinkron (dibatasi hingga pembaruan batas kecepatan), begitu pula interaksi di masa mendatang dengan objek yang dicatat di konsol (seperti memperluas properti objek).
Jadi konsol mungkin akan mengkloning (membuat serial) objek yang bisa berubah yang Anda catat, atau akan menyimpan referensi ke sana. Yang pertama tidak berfungsi dengan baik dengan objek dalam / besar. Juga, setidaknya rendering awal di konsol mungkin akan menunjukkan status "saat ini" dari objek, yaitu saat ia masuk - dalam contoh Anda, Anda lihat Object {}
.
Namun, saat Anda memperluas objek untuk memeriksa propertinya lebih jauh, kemungkinan konsol hanya akan menyimpan referensi ke objek dan propertinya, dan menampilkannya sekarang akan menampilkan status saat ini (sudah bermutasi). Jika Anda mengklik +
, Anda akan melihat bar
properti dalam contoh Anda.
Berikut adalah tangkapan layar yang telah diposting di laporan bug untuk menjelaskan "perbaikan" mereka:
Jadi, beberapa nilai mungkin direferensikan lama setelah dicatat, dan evaluasinya agak lambat ("bila diperlukan"). Contoh paling terkenal dari perbedaan ini ditangani dalam pertanyaan Apakah konsol JavaScript Chrome malas mengevaluasi array?
Solusinya adalah memastikan untuk selalu mencatat snapshot serial dari objek Anda, misalnya dengan melakukan console.log(JSON.stringify(obj))
. Ini akan bekerja untuk objek non-lingkaran dan agak kecil saja. Lihat juga Bagaimana cara mengubah perilaku default console.log di Safari? .
Solusi yang lebih baik adalah dengan menggunakan breakpoint untuk debugging, di mana eksekusi benar-benar berhenti dan Anda dapat memeriksa nilai saat ini di setiap titik. Gunakan logging hanya dengan data yang dapat diserialisasikan dan tidak dapat diubah.