Array.prototype[Symbol.iterator]()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.
Phương thức [Symbol.iterator]() của các đối tượng Array triển khai giao thức iterable và cho phép mảng được sử dụng bởi hầu hết các cú pháp yêu cầu iterable, chẳng hạn như cú pháp spread và vòng lặp for...of. Nó trả về một đối tượng iterator mảng trả ra giá trị của từng chỉ mục trong mảng.
Giá trị ban đầu của thuộc tính này là cùng đối tượng hàm với giá trị ban đầu của thuộc tính Array.prototype.values.
Try it
const array = ["a", "b", "c"];
const iterator = array[Symbol.iterator]();
for (const value of iterator) {
console.log(value);
}
// Expected output: "a"
// Expected output: "b"
// Expected output: "c"
Cú pháp
array[Symbol.iterator]()
Tham số
Không có.
Giá trị trả về
Giá trị trả về giống với Array.prototype.values(): một đối tượng iterator iterable mới trả ra giá trị của từng chỉ mục trong mảng.
Ví dụ
>Lặp qua vòng lặp for...of
Lưu ý rằng bạn hiếm khi cần gọi phương thức này trực tiếp. Sự tồn tại của phương thức [Symbol.iterator]() khiến mảng có thể lặp, và các cú pháp lặp như vòng lặp for...of tự động gọi phương thức này để lấy iterator để lặp qua.
HTML
<ul id="letterResult"></ul>
JavaScript
const arr = ["a", "b", "c"];
const letterResult = document.getElementById("letterResult");
for (const letter of arr) {
const li = document.createElement("li");
li.textContent = letter;
letterResult.appendChild(li);
}
Kết quả
Tự điều khiển iterator thủ công
Bạn vẫn có thể gọi thủ công phương thức next() của đối tượng iterator được trả về để đạt được mức kiểm soát tối đa đối với quá trình lặp.
const arr = ["a", "b", "c", "d", "e"];
const arrIter = arr[Symbol.iterator]();
console.log(arrIter.next().value); // a
console.log(arrIter.next().value); // b
console.log(arrIter.next().value); // c
console.log(arrIter.next().value); // d
console.log(arrIter.next().value); // e
Xử lý chuỗi và mảng chuỗi với cùng một hàm
Vì cả chuỗi và mảng đều triển khai giao thức iterable, một hàm tổng quát có thể được thiết kế để xử lý cả hai đầu vào theo cùng cách. Điều này tốt hơn so với việc gọi Array.prototype.values() trực tiếp, vì điều đó yêu cầu đầu vào phải là mảng, hoặc ít nhất là đối tượng có phương thức đó.
function logIterable(it) {
if (typeof it[Symbol.iterator] !== "function") {
console.log(it, "is not iterable.");
return;
}
for (const letter of it) {
console.log(letter);
}
}
// Array
logIterable(["a", "b", "c"]);
// a
// b
// c
// String
logIterable("abc");
// a
// b
// c
// Number
logIterable(123);
// 123 is not iterable.
Thông số kỹ thuật
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-array.prototype-%symbol.iterator%> |