NodeList hiện có forEach () trong tất cả các trình duyệt chính
Xem nodeList forEach () trên MDN .
Câu trả lời ban đầu
Không có câu trả lời nào trong số này giải thích tại sao NodeList không kế thừa từ Array, do đó cho phép nó có forEach
và tất cả phần còn lại.
Câu trả lời được tìm thấy trên chủ đề es-thảo luận này . Tóm lại, nó phá vỡ trang web:
Vấn đề là mã giả định không chính xác instanceof có nghĩa là phiên bản là một Mảng kết hợp với Array.prototype.concat.
Có một lỗi trong Thư viện đóng cửa của Google khiến hầu hết các ứng dụng của Google bị lỗi do lỗi này. Thư viện đã được cập nhật ngay sau khi điều này được tìm thấy nhưng vẫn có thể có mã ngoài đó tạo ra giả định không chính xác tương tự kết hợp với concat.
Đó là, một số mã đã làm một cái gì đó như
if (x instanceof Array) {
otherArray.concat(x);
} else {
doSomethingElseWith(x);
}
Tuy nhiên, concat
sẽ xử lý mảng "thực" (không phải mảng instanceof) khác với các đối tượng khác:
[1, 2, 3].concat([4, 5, 6]) // [1, 2, 3, 4, 5, 6]
[1, 2, 3].concat(4) // [1, 2, 3, 4]
vì vậy điều đó có nghĩa là đoạn mã trên x
đã bị hỏng khi còn là NodeList, bởi vì trước khi nó đi xuống doSomethingElseWith(x)
đường dẫn, trong khi sau đó nó đi xuống otherArray.concat(x)
đường dẫn, điều này đã gây ra một điều gì đó kỳ lạ vì x
không phải là một mảng thực.
Trong một thời gian, có một đề xuất cho một Elements
lớp là lớp con thực sự của Array và sẽ được sử dụng làm "NodeList mới". Tuy nhiên, điều đó đã bị xóa khỏi Tiêu chuẩn DOM , ít nhất là hiện tại, vì nó không khả thi để triển khai vì nhiều lý do liên quan đến kỹ thuật và đặc điểm kỹ thuật.