ES2025 thêm các method map, filter, take, drop, flatMap, reduce, toArray... trực tiếp lên Iterator.prototype — dùng được cho mọi iterator (generator, map.values(), set.values()).
Khác biệt cốt lõi: lazy (lười). Array method tạo mảng trung gian ở mỗi bước và xử lý toàn bộ; iterator helper xử lý từng phần tử qua cả pipeline khi cần, không tạo mảng trung gian. Nhờ vậy chúng hoạt động được trên iterator vô hạn.
function* naturals() { let n = 1; while (true) yield n++; }
const firstThreeEven = naturals()
.filter((n) => n % 2 === 0)
.map((n) => n * 10)
.take(3)
.toArray();
// [20, 40, 60] — chạy xong, không treo dù nguồn vô hạntake(n)lấy n phần tử đầu rồi dừng nguồn (đây là thứ khiến vô hạn an toàn).drop(n)bỏ qua n phần tử đầu.
So với array: [...naturals()].filter(...) sẽ treo vĩnh viễn. Với dữ liệu hữu hạn nhưng lớn, helper tiết kiệm bộ nhớ vì không materialize mảng trung gian.
Lưu ý: kết quả vẫn là iterator (gọi .toArray() hoặc for...of để tiêu thụ); iterator chỉ chạy một lần.
ES2025 adds map, filter, take, drop, flatMap, reduce, toArray... directly on Iterator.prototype — usable on any iterator (generators, map.values(), set.values()).
Core difference: laziness. Array methods build an intermediate array at each step and process everything; iterator helpers pull one element through the whole pipeline on demand, with no intermediate arrays. That's why they work on infinite iterators.
function* naturals() { let n = 1; while (true) yield n++; }
const firstThreeEven = naturals()
.filter((n) => n % 2 === 0)
.map((n) => n * 10)
.take(3)
.toArray();
// [20, 40, 60] — terminates even with an infinite sourcetake(n)takes the first n then stops the source (this makes infinity safe).drop(n)skips the first n.
Vs arrays: [...naturals()].filter(...) hangs forever. For large finite data, helpers save memory by not materializing intermediates.
Note: the result is still an iterator (consume via .toArray() or for...of); iterators are one-shot.