ตอนนี้ NodeList มี forEach () ในเบราว์เซอร์หลักทั้งหมด
ดูnodeList forEach () บน MDN
คำตอบเดิม
ไม่มีคำตอบใดที่อธิบายว่าเหตุใด NodeList จึงไม่สืบทอดจาก Array จึงทำให้มีforEach
และส่วนที่เหลือทั้งหมด
พบคำตอบในกระทู้สนทนานี้ ในระยะสั้นมันทำลายเว็บ:
ปัญหาคือโค้ดที่สันนิษฐานว่าอินสแตนซ์ไม่ถูกต้องซึ่งหมายความว่าอินสแตนซ์นั้นเป็น Array ร่วมกับ Array.prototype.concat
มีข้อบกพร่องในไลบรารีการปิดของ Google ซึ่งทำให้แอปเกือบทั้งหมดของ Google ล้มเหลวเนื่องจากเหตุนี้ ไลบรารีได้รับการอัปเดตทันทีที่พบสิ่งนี้ แต่อาจยังมีโค้ดอยู่ที่นั่นซึ่งทำให้สมมติฐานที่ไม่ถูกต้องเหมือนกันเมื่อใช้ร่วมกับ concat
นั่นคือโค้ดบางตัวทำบางอย่างเช่น
if (x instanceof Array) {
otherArray.concat(x);
} else {
doSomethingElseWith(x);
}
อย่างไรก็ตามconcat
จะถือว่าอาร์เรย์ "จริง" (ไม่ใช่อินสแตนซ์ของอาร์เรย์) แตกต่างจากวัตถุอื่น ๆ :
[1, 2, 3].concat([4, 5, 6])
[1, 2, 3].concat(4)
นั่นหมายความว่าโค้ดด้านบนพังเมื่อx
เป็น NodeList เพราะก่อนที่มันจะไปตามdoSomethingElseWith(x)
เส้นทางในขณะที่หลังจากนั้นมันก็ไปตามotherArray.concat(x)
เส้นทางซึ่งทำอะไรแปลก ๆ เนื่องจากx
ไม่ใช่อาร์เรย์จริง
บางครั้งมีข้อเสนอสำหรับElements
คลาสที่เป็นคลาสย่อยจริงของ Array และจะใช้เป็น "NodeList ใหม่" อย่างไรก็ตามสิ่งนี้ได้ถูกลบออกจาก DOM Standardแล้วอย่างน้อยก็ในตอนนี้เนื่องจากยังไม่สามารถใช้งานได้ด้วยเหตุผลทางเทคนิคและข้อกำหนดที่เกี่ยวข้องหลายประการ