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

js
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

html
<ul id="letterResult"></ul>

JavaScript

js
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.

js
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 đó.

js
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

Thông số kỹ thuật
ECMAScript® 2027 Language Specification
# sec-array.prototype-%symbol.iterator%

Khả năng tương thích với trình duyệt

Xem thêm