console.log
ไม่ได้เป็นมาตรฐานดังนั้นพฤติกรรมจึงค่อนข้างไม่มีการกำหนดและสามารถเปลี่ยนแปลงได้อย่างง่ายดายจากรุ่นสู่รุ่นของเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ หนังสือของคุณมีแนวโน้มที่จะล้าสมัยเนื่องจากคำตอบของฉันในไม่ช้า
สำหรับรหัสของเรามันไม่ได้สร้างความแตกต่างใด ๆ ไม่ว่าจะconsole.log
เป็นแบบ async หรือไม่ก็ไม่มีการโทรกลับใด ๆ และค่าที่คุณส่งผ่านจะถูกอ้างอิงและคำนวณเสมอเมื่อคุณเรียกใช้ฟังก์ชัน
เราไม่รู้จริงๆว่าจะเกิดอะไรขึ้น (ตกลงเราทำได้เนื่องจาก Firebug, Chrome Devtools และ Opera Dragonfly เป็นโอเพ่นซอร์สทั้งหมด) คอนโซลจะต้องจัดเก็บค่าที่บันทึกไว้ที่ใดที่หนึ่งและจะแสดงบนหน้าจอ การแสดงผลจะเกิดขึ้นแบบอะซิงโครนัสอย่างแน่นอน (ถูกควบคุมให้เป็นการอัปเดต จำกัด อัตรา) เช่นเดียวกับการโต้ตอบในอนาคตกับอ็อบเจ็กต์ที่บันทึกในคอนโซล (เช่นการขยายคุณสมบัติอ็อบเจ็กต์)
ดังนั้นคอนโซลอาจโคลน (ทำให้เป็นอนุกรม) อ็อบเจ็กต์ที่ไม่แน่นอนที่คุณบันทึกไว้หรือจะเก็บข้อมูลอ้างอิงไว้ อันแรกใช้ไม่ได้ผลกับวัตถุที่ลึก / ใหญ่ นอกจากนี้อย่างน้อยการแสดงผลครั้งแรกในคอนโซลอาจจะแสดงสถานะ "ปัจจุบัน" ของวัตถุหนึ่งคือเมื่อมันได้รับการบันทึกไว้ - Object {}
ในตัวอย่างของคุณที่คุณเห็น
อย่างไรก็ตามเมื่อคุณขยายออบเจ็กต์เพื่อตรวจสอบคุณสมบัติเพิ่มเติมเป็นไปได้ว่าคอนโซลจะจัดเก็บเฉพาะการอ้างอิงไปยังออบเจ็กต์และคุณสมบัติของคุณและการแสดงตอนนี้จะแสดงสถานะปัจจุบัน (กลายพันธุ์แล้ว) หากคุณคลิกที่+
คุณควรจะเห็นbar
คุณสมบัติในตัวอย่างของคุณ
นี่คือภาพหน้าจอที่โพสต์ในรายงานข้อบกพร่องเพื่ออธิบาย "การแก้ไข":
ดังนั้นค่าบางค่าอาจถูกอ้างอิงนานหลังจากที่บันทึกไว้และการประเมินค่าเหล่านี้ค่อนข้างขี้เกียจ ("เมื่อจำเป็น") ตัวอย่างที่มีชื่อเสียงที่สุดของความคลาดเคลื่อนนี้ได้รับการจัดการในคำถามคอนโซล JavaScript ของ Chrome ขี้เกียจเกี่ยวกับการประเมินอาร์เรย์หรือไม่?
console.log(JSON.stringify(obj))
การแก้ปัญหาเพื่อให้แน่ใจว่าการเข้าสู่ระบบภาพรวมต่อเนื่องของวัตถุของคุณเสมอเช่นโดยการทำ วิธีนี้ใช้ได้กับวัตถุที่ไม่เป็นวงกลมและค่อนข้างเล็กเท่านั้น ดูเพิ่มเติมฉันจะเปลี่ยนพฤติกรรมเริ่มต้นของ console.log ใน Safari ได้อย่างไร .
ทางออกที่ดีกว่าคือการใช้เบรกพอยต์สำหรับการดีบักซึ่งการดำเนินการจะหยุดลงโดยสมบูรณ์และคุณสามารถตรวจสอบค่าปัจจุบันในแต่ละจุดได้ ใช้การบันทึกเฉพาะกับข้อมูลที่ต่อเนื่องกันและไม่เปลี่ยนรูปได้