Iterator in javascript
Bài đăng này đã không được cập nhật trong 8 năm
Một số khái niệm
Iterator và iterator result
Iterator là 1 object có thể lấy ra lần lượt các iterator result, implement method next() và bằng cách gọi method next() có thể trả về iterator result. Giá trị trả về này là 1 object có chứa thuộc tính done cho biết có thể đã kết thúc chuỗi iterated sequence hay chưa và thuộc tính value để  biểu thị giá trị.
Dưới đây là 1 ví dụ minh họa về iterator và iterator result
var it = {}; // iterator
it.next = function(){
    var r = { value: 5, done: false }; // iterator result
    return r;
};
Iterable object
Iterable object là 1 object có chứa iterator. Cụ thể khi gọi [Symbol.iterator]() sẽ trả về iterator của object đó
var it = {}; // iterator
it.next = function(){
    var r = { value: 5, done: false }; // iterator result
    return r;
};
var obj = {}; // iterable object
obj[Symbol.iterator] = function(){
    return iterator;
};
Sử dụng iterator
Tạo 1 iterable object
Xét 1 ví dụ đơn giản tạo 1 iteratable object có thể lấy ra các số nguyên từ 1 đến 5.
Dựa theo các khái niệm đã nói ở trên, ta cần tạo 1 object obj mà khi gọi obj[Symbol.iterator] sẽ trả về iterator. Iterator đố cần định nghĩa method next để có thể lấy được phấn tử tiếp theo.
var obj = {}; // iterable object
obj[Symbol.iterator] = function(){
    var it = {}; // iterator
    var count = 1;
    it.next = function(){
        var r = (count <= 5)
            ? { value: count++,   done: false }
            : { value: undefined, done: true };
        return r; // iterator result
    };
    return it;
};
Lâý danh sách các giá trị từ iterable object
Sử dụng iterable object được định nghĩa ở ví dụ trước, ta có thể  in ra danh sách các giá trị từ iterable object bằng cách loop cho đến khi iterator result có thuộc tính done là true
var iterator = obj[Symbol.iterator]();
var iteratorResult;
while(true){
    iteratorResult = iterator.next();
    if(iteratorResult.done) break;
    console.log(iteratorResult.value);
}
Kết quả
1
2
3
4
5
Ta cũng có thể viết ngắn gọn hơn bằng cách sử dụng for
for(var v of obj) console.log(v);
Kết quả trả về là tương đương
Builtin iterables
Array
Array cung cấp những method keys, entries để  thu thập giá trị cũng như index của các phần tử trong mảng
var obj = ["A", "B", "C"];
for(var v of obj) console.log(v);
for(var v of obj.keys()) console.log(v);
for(var v of obj.entries()) console.log(v);
A
B
C
0
1
2
[0, "A"]
[1, "B"]
[2, "C"]
String
Chúng ta cũng có thể loop qua và in ra từng kí tự của String
var str = "abc";
for(var v of str) console.log(v);
a
b
c
Kiểu dữ liệu khác
Ngoài array, string, Javascript còn cung cấp nhiều kiểu dữ liệu iterable khác như Map, Set, Generator
Một số ứng dụng cụ thể
Toán tử
Sử dụng toán tử  ... chúng ta có thể  khởi tạo mảng từ các iterable object
var ary = [0, "A", false];
var str = "xyz";
var arr = [...ary, ...str];
console.log(arr);
=> [0, "A", false, "x", "y", "z"]
Truyền iterable object như tham số
var nums = [104, 101, 108, 108, 111];
console.log( Math.max(...nums) );
console.log( String.fromCharCode(...nums) );
=>
111
hello
Phép gán
Javascript cho phép cú pháp [a ,b ,c ] = iterable để  gán lần lượt giá trị của iterable object vào các biến theo thứ tự
var [a, b, c] = "hai";
console.log(c+b+a);
=> iah
All rights reserved
 
  
 