01/10/2018, 17:14
Iterator & Iterable trong Javascript?
Tình hình mình mần về ES6 đang phân vân chưa hiểu sự khác nhau và cách dùng của 2 chú này. Ai chỉ mình với
Bài liên quan
Tình hình mình mần về ES6 đang phân vân chưa hiểu sự khác nhau và cách dùng của 2 chú này. Ai chỉ mình với
Iterator là danh từ
Iterable là tính từ
Iterator là 1 đối tượng cụ thể
Iterable là khả năng của đối tượng
Iterators and generators
Processing each of the items in a collection is a very common operation. JavaScript provides a number of ways of iterating over a collection, from simple for loops to map() and filter(). Iterators and Generators bring the concept of iteration...
Iterable là tính từ chỉ khả năng nên ta không dùng
Cách dùng Iterator : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols
JavaScript hay sử dụng Duck typing để nhận biết object thuộc kiểu dữ liệu nào.
Iterablelà object có 1 property đặc biệt:Symbolvà có tên@@iterator, tên của key không thể truy xuất thông qua literal như string hay number, mà qua propertyiteratorcủaSymbolobject, haySymbol.iteratorfunction, function không có tham số truyền vàoĐoạn code sau tạo biến
iterdạngIterable. Mình sử dụng cả 2 cách ES6 và ES5. ES6 sẽ nhanh hơn so với ES5 một chút.Thông thường
Iterablesau khi gọi function object của property@@iteratorthì sẽ trả vềIteratorobject. Tuy nhiên, JavaScript nhận diện kiểu duck typing, nên có thể trả về object bất kì. JavaScript chỉ biếtIterablelà object có property là@@iteratorvà value của@@iteratorcó kiểu function.Vì vậy cách nhận biết 1 object là
Iterableđược hiện thực gần giống như sau:Iteratorlà object có 3 property có value thuộc kiểu function là:next,return,throw, nó sẽ có dạng tương tự như sau:Function nhận biết object là
Iteratornhư sau:nextcủaIteratortrả về object có 2 property làvaluevàdone:valuecó giá trị bất kì, nhưng thường dùng để liệt kê phần tử trong array-like object. Array-like object là object có các property dạng “0”, “1”, “2”,… Các property đều có property descriptorenumerablelàtrue.donecó giá trịtruehoặcfalse, kiểu boolean.donethường được dùng thông báo bạn đã duyệt hết phần tử trong array-like object chưa. Nếu chưa trả vềfalse, nếu đã duyệt hết thì trả vềtrue.returngọi tớinext. Sau đóreturnsẽ thay đổi propertydonetừ kết quả trả về củanextsang true và trả về object đã thay đổi.throwgọi tớinext.throwkhông có trả về bất kì giá trị gì, nênthrowtrả về giá trịundefined. Ngoài ra,throwgọi lệnhthrowvới giá trịvaluecủa object trả về từnext.Vì vậy object có dạng
Iteratorđược hiện thực như sau:Ứng dụng của
IterablevàIteratorđược dùng để hiện thực Iterator pattern.Ví dụ mình tạo 1 array-like object có dạng
Iterableđể duyệt các phần tử từ 1 đến 6. Đoạn code bên dưới:Đầu tiên, mình gọi
@@iterator()đếnIterableđể trả vềIteratorSau đó, mình gọi tiếp các
next()trongIteratorvà in nó raOutput
Bước gọi trên có thể viết gọn lại trong bằng lệnh
for of. Cho kết quả tương tựfor letgọi@@iteratorcủaIterableđứng đằng sauof. Sau đó gọinext()cho mỗi lần lặp. Nếu object trả về từnext()có propertydonetrả vềfalsethì thực hiện các câu lệnh trong block.Điều kiện kết thúc của
for of:donebằngtruetừ object trả vềnext()hoặcreturn()throw()