Rumah > Soal Jawab > teks badan
P粉9305342802023-08-28 22:01:29
Ini sebenarnya bukan jawapan kepada soalan, tetapi ia mungkin berguna untuk sesiapa sahaja yang terjumpa siaran ini dan ulasan ini terlalu panjang:
window.console.logSync = (...args) => { try { args = args.map((arg) => JSON.parse(JSON.stringify(arg))); console.log(...args); } catch (error) { console.log('Error trying to console.logSync()', ...args); } };
Ini akan mencipta versi pseudo-segerak console.log
tetapi dengan kaveat yang sama yang disebut dalam jawapan yang diterima.
Memandangkan nampaknya kebanyakan penyemak imbas hari ini console.log
tidak segerak dalam beberapa cara, anda mungkin mahu menggunakan fungsi seperti ini dalam beberapa kes.
P粉1419251812023-08-28 15:47:19
console.log
Tiada penyeragaman jadi tingkah laku agak tidak ditentukan dan boleh menukar dengan mudah antara versi alat pembangun yang berbeza. Buku anda mungkin sudah lapuk, dan jawapan saya mungkin akan lapuk tidak lama lagi.
Untuk kod kami, tiada bezanya sama ada console.log tidak segerak atau tidak, ia tidak memberikan sebarang jenis panggilan balik dan lain-lain dan nilai yang anda berikan sentiasa dirujuk dan dinilai apabila anda memanggil fungsi tersebut.
Kami tidak benar-benar tahu apa yang akan berlaku seterusnya (baik, kami boleh, kerana Firebug, Chrome Devtools dan Opera Dragonfly semuanya adalah sumber terbuka). Konsol perlu menyimpan nilai yang dilog di suatu tempat dan memaparkannya pada skrin. Rendering pasti akan berlaku secara tidak segerak (tertakluk kepada kemas kini terhad kadar), begitu juga interaksi masa hadapan dengan objek yang dilog dalam konsol (seperti memanjangkan sifat objek).
Jadi konsol boleh mengklon (mensiri) objek boleh ubah log anda, atau ia akan menyimpan rujukan kepada mereka. Yang pertama tidak berfungsi dengan objek dalam/besar. Selain itu, sekurang-kurangnya pemaparan awal dalam konsol mungkin menunjukkan keadaan "semasa" objek, iaitu keadaan semasa rakaman - dalam contoh anda, anda lihat Object {}
.
Walau bagaimanapun, apabila anda mengembangkan objek untuk memeriksa lebih lanjut sifatnya, konsol hanya boleh menyimpan rujukan kepada objek dan sifatnya, menunjukkannya sekarang akan menunjukkan keadaan semasanya (bermutasi). Jika anda klik pada atribut +
,您应该能够在示例中看到 bar
.
Berikut ialah tangkapan skrin yang disiarkan dalam laporan pepijat menerangkan "pembetulan" mereka:
Oleh itu, sesetengah nilai mungkin tidak dirujuk sehingga lama selepas ia direkodkan, dan penilaian nilai ini agak malas ("apabila diperlukan"). Contoh paling terkenal bagi perbezaan ini ialah dalam soalan Adakah konsol JavaScript Chrome mengendalikan penilaian malas tatasusunan?
Penyelesaian adalah untuk memastikan syot kilat bersiri objek sentiasa dilog, cth. dengan melakukan console.log(JSON.stringify(obj)). Walau bagaimanapun, ini hanya berfungsi untuk objek bukan bulat dan agak kecil. Lihat juga Bagaimana untuk menukar tingkah laku lalai console.log masuk Safari? .
Penyelesaian yang lebih baik ialah menggunakan titik putus untuk penyahpepijatan, di mana pelaksanaan berhenti sepenuhnya dan anda boleh memeriksa nilai semasa pada setiap titik. Gunakan pengelogan hanya untuk data boleh bersiri dan tidak boleh diubah.