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.
Iterable
là object có 1 property đặc biệt:Symbol
và 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 propertyiterator
củaSymbol
object, haySymbol.iterator
function
, function không có tham số truyền vàoĐoạn code sau tạo biến
iter
dạ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
Iterable
sau khi gọi function object của property@@iterator
thì sẽ trả vềIterator
object. 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ếtIterable
là object có property là@@iterator
và value của@@iterator
có 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:Iterator
là 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à
Iterator
như sau:next
củaIterator
trả về object có 2 property làvalue
vàdone
:value
có 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 descriptorenumerable
làtrue
.done
có giá trịtrue
hoặcfalse
, kiểu boolean.done
thườ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
.return
gọi tớinext
. Sau đóreturn
sẽ thay đổi propertydone
từ kết quả trả về củanext
sang true và trả về object đã thay đổi.throw
gọi tớinext
.throw
không có trả về bất kì giá trị gì, nênthrow
trả về giá trịundefined
. Ngoài ra,throw
gọi lệnhthrow
với giá trịvalue
củ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
Iterable
và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ềIterator
Sau đó, mình gọi tiếp các
next()
trongIterator
và 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 let
gọi@@iterator
củaIterable
đứng đằng sauof
. Sau đó gọinext()
cho mỗi lần lặp. Nếu object trả về từnext()
có propertydone
trả vềfalse
thì thực hiện các câu lệnh trong block.Điều kiện kết thúc của
for of
:done
bằngtrue
từ object trả vềnext()
hoặcreturn()
throw()