# JavaScript - Operator Yield

## Giới thiệu về Operator Yield

Xin chào các bạn đang học lập trình! Hôm nay, chúng ta sẽ bắt đầu một hành trình thú vị vào thế giới của operator yield trong JavaScript. Hãy tưởng tượng yield như một nút tạm dừng kỳ diệu cho mã của bạn. Nó giống như đang nói với chương trình của bạn, "Hey, hãy nghỉ ngơi ở đây, và chúng ta sẽ tiếp tục từ nơi này sau này." Đ有趣 phải không? Hãy cùng nhau khám phá!

## Yield Operator là gì?

Operator yield là một từ khóa đặc biệt trong JavaScript được sử dụng bên trong các hàm generator. Bây giờ, tôi biết bạn đang nghĩ gì - "Hàm generator? Đó là gì vậy?" Đừng lo lắng, chúng ta sẽ đến phần đó! Hiện tại, chỉ cần tưởng tượng một hàm generator là một loại hàm đặc biệt có thể tạm dừng và tiếp tục thực thi. Operator yield là gì làm cho việc tạm dừng và tiếp tục này trở nên khả thi.

### So sánh với thực tế

Hãy tưởng tượng bạn đang đọc một cuốn sách rất dài. Bạn có thể sử dụng một bookmark để lưu lại vị trí khi bạn cần nghỉ ngơi. Operator yield trong mã của bạn cũng giống như bookmark đó. Nó đánh dấu một vị trí mà hàm có thể tạm dừng, và sau đó quay lại sau này.

## Cú pháp của Operator Yield

Cú pháp cơ bản của operator yield rất đơn giản:

```javascript
yield expression;

Ở đây, expression là giá trị bạn muốn "yield" hoặc trả về khi hàm tạm dừng. Nó là tùy chọn, và nếu bạn không cung cấp, undefined sẽ được yield thay vì.

JavaScript - Yield Operator

Operator Yield trong Hàm Generator

Bây giờ, hãy nói về những hàm generator bí ẩn này. Một hàm generator được định nghĩa bằng cách sử dụng dấu sao (*) sau từ khóa function:

function* generatorFunction() {
  yield 'Hello';
  yield 'World';
}

Khi bạn gọi một hàm generator, nó không chạy mã bên trong ngay lập tức. Thay vào đó, nó trả về một đối tượng generator mà bạn có thể sử dụng để kiểm soát việc thực thi của hàm.

Ví dụ: Trả về một giá trị

Hãy xem một ví dụ đơn giản:

function* countToThree() {
  yield 1;
  yield 2;
  yield 3;
}

const generator = countToThree();
console.log(generator.next().value); // Output: 1
console.log(generator.next().value); // Output: 2
console.log(generator.next().value); // Output: 3

Trong ví dụ này, mỗi lần chúng ta gọi next() trên generator, nó chạy cho đến khi gặp một câu lệnh yield, sau đó tạm dừng và trả về giá trị được yield. Nó giống như hàm đang nói, "Đây là số tiếp theo, hãy gọi tôi lại để lấy số tiếp theo!"

Ví dụ: Trả về Undefined

Nếu chúng ta không chỉ định một giá trị để yield, nó sẽ trả về undefined:

function* yieldUndefined() {
  yield;
  yield 'Hello';
  yield;
}

const gen = yieldUndefined();
console.log(gen.next().value); // Output: undefined
console.log(gen.next().value); // Output: Hello
console.log(gen.next().value); // Output: undefined

Điều này có thể hữu ích khi bạn muốn tạo một điểm tạm dừng trong hàm generator mà không nhất thiết phải trả về một giá trị.

Ví dụ: Truyền giá trị vào phương thức next()

Đây là phần thực sự thú vị. Bạn thực sự có thể truyền một giá trị vào phương thức next(), và giá trị này sẽ được nhận bởi hàm generator:

function* conversation() {
  const name = yield "What's your name?";
  yield `Hello, ${name}!`;
  const hobby = yield "What's your favorite hobby?";
  yield `${hobby} sounds fun!`;
}

const talk = conversation();
console.log(talk.next().value);        // Output: What's your name?
console.log(talk.next('Alice').value); // Output: Hello, Alice!
console.log(talk.next().value);        // Output: What's your favorite hobby?
console.log(talk.next('Coding').value); // Output: Coding sounds fun!

Điều này giống như đang có một cuộc trò chuyện với mã của bạn. Generator hỏi một câu hỏi, tạm dừng để chờ câu trả lời của bạn, sau đó tiếp tục dựa trên câu trả lời của bạn. Rất thú vị phải không?

Ví dụ Thực tế: Generator chuỗi Fibonacci

Hãy kết hợp tất cả những kiến thức này với một ví dụ thực tế. Chúng ta sẽ tạo một hàm generator sản xuất chuỗi Fibonacci:

function* fibonacciGenerator() {
  let a = 0, b = 1;
  while (true) {
    yield a;
    [a, b] = [b, a + b];
  }
}

const fib = fibonacciGenerator();
for (let i = 0; i < 10; i++) {
  console.log(fib.next().value);
}

Generator này sẽ tiếp tục sản xuất các số Fibonacci vô hạn. Mỗi lần chúng ta gọi next(), nó yield số tiếp theo trong chuỗi. Chúng ta sử dụng một vòng lặp for ở đây để lấy 10 số đầu tiên, nhưng chúng ta có thể tiếp tục lâu hơn nếu muốn!

Kết luận

Operator yield là một công cụ mạnh mẽ trong JavaScript giúp mở ra nhiều khả năng mới cho việc kiểm soát luồng mã của bạn. Nó cho phép bạn tạo ra các hàm có thể tạm dừng và tiếp tục, giúp việc làm việc với các chuỗi giá trị qua thời gian trở nên dễ dàng hơn.

Nhớ rằng, việc học cách sử dụng yield và generators hiệu quả đòi hỏi sự luyện tập. Đừng nản lòng nếu nó không ngay lập tức hiểu rõ - hãy tiếp tục thử nghiệm và bạn sẽ sớm yield như một chuyên gia!

Bảng các phương thức

Dưới đây là bảng các phương thức chính được sử dụng với generators:

Phương thức Mô tả
next() Trả về giá trị tiếp theo trong generator
return(value) Trả về giá trị đã cho và kết thúc generator
throw(error) Ném một lỗi vào generator

Chúc các bạn lập trình vui vẻ, các nhà lập trình tương lai! Nhớ rằng, mỗi chuyên gia đều từng là người mới bắt đầu. Hãy tiếp tục luyện tập, 保持好奇心, và trước khi bạn biết, bạn sẽ yield đến đỉnh cao của lập trình!

Credits: Image by storyset