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.

Thuộc tính dữ liệu tĩnh Symbol.iterator đại diện cho well-known symbol Symbol.iterator. Giao thức iterable tra cứu symbol này cho phương thức trả về iterator cho một đối tượng. Để một đối tượng có thể lặp lại, nó phải có khóa [Symbol.iterator].

Try it

const iterable = {};

iterable[Symbol.iterator] = function* () {
  yield 1;
  yield 2;
  yield 3;
};

console.log([...iterable]);
// Expected output: Array [1, 2, 3]

Giá trị

Well-known symbol Symbol.iterator.

Property attributes of Symbol.iterator
Writableno
Enumerableno
Configurableno

Mô tả

Mỗi khi một đối tượng cần được lặp lại (chẳng hạn như ở đầu vòng lặp for...of), phương thức [Symbol.iterator]() của nó được gọi mà không có đối số, và iterator được trả về sẽ được dùng để thu thập các giá trị cần lặp.

Một số kiểu tích hợp sẵn có hành vi lặp lại mặc định, trong khi các kiểu khác (như Object) thì không. Một số kiểu tích hợp sẵn có phương thức [Symbol.iterator]():

Xem thêm Giao thức lặp lại để biết thêm thông tin.

Ví dụ

Iterable do người dùng định nghĩa

Chúng ta có thể tạo iterable của riêng mình như sau:

js
const myIterable = {};
myIterable[Symbol.iterator] = function* () {
  yield 1;
  yield 2;
  yield 3;
};
[...myIterable]; // [1, 2, 3]

Hoặc iterable có thể được định nghĩa trực tiếp bên trong một class hoặc đối tượng bằng computed property:

js
class Foo {
  *[Symbol.iterator]() {
    yield 1;
    yield 2;
    yield 3;
  }
}

const someObj = {
  *[Symbol.iterator]() {
    yield "a";
    yield "b";
  },
};

console.log(...new Foo()); // 1, 2, 3
console.log(...someObj); // 'a', 'b'

Iterable không đúng định dạng

Nếu phương thức [Symbol.iterator]() của iterable không trả về một đối tượng iterator, thì đây là iterable không đúng định dạng. Sử dụng nó như vậy có thể dẫn đến ngoại lệ runtime hoặc hành vi lỗi:

js
const nonWellFormedIterable = {};
nonWellFormedIterable[Symbol.iterator] = () => 1;
[...nonWellFormedIterable]; // TypeError: [Symbol.iterator]() returned a non-object value

Đặc tả

Specification
ECMAScript® 2027 Language Specification
# sec-symbol.iterator

Tương thích trình duyệt

Xem thêm