본문 바로가기

JavaScript/AboutJS

[JavsScript] yield* 란?

  1.  yield*는 하나의 표현식입니다. 여기서 *는 yield와 함께 특별한 의미를 가집니다.
  2. ECMAScript 명세에 따르면, yield*는 "YieldExpression"의 한 형태로 정의됩니다.
  3.  yield*는 뒤에 오는 제너레이터나 이터러블 의 각 값을 현재 제너레이터의 yield 지점으로 전달합니다.
    이는 마치 해당 제너레이터나 이터러블의 모든 값을 현재 제너레이터 내에서 개별적으로 yield하는 것과 같은 효과를 냅니다.

    1. ECMAScript 2015 언어 명세 (ECMA-262, 6th Edition):
    https://www.ecma-international.org/ecma-262/6.0/#sec-generator-function-definitions
    2.MDN Web Docs의 yield 문서:
    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/yield

function* gen1() {
  yield 1;
  yield 2;
}

function* gen2() {
  yield* gen1();  // gen1의 모든 값을 yield
  yield 3;
}

for (let value of gen2()) {
  console.log(value);
}
// 출력:
// 1
// 2
// 3

 

function*  yield*
해당 함수가 제너레이터 함수임을 선언  다른 제너레이터나 이터러블 객체에 제어를 위임(delegate)하는 역할

 

 

4. 제너레이터 객체 말고도, yield*는 다른 반복 가능한 객체도 yield 할 수 있습니다. ( 배열, 문자열 또는 arguments 객체 )

function* g3() {
  yield* [1, 2];
  yield* "34";
  yield* Array.from(arguments);
}

let iterator = g3(5, 6);

console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: "3", done: false }
console.log(iterator.next()); // { value: "4", done: false }
console.log(iterator.next()); // { value: 5, done: false }
console.log(iterator.next()); // { value: 6, done: false }
console.log(iterator.next()); // { value: undefined, done: true }

 

5. yield* 는 구문이 아닌 표현입니다. 따라서 값으로 평가됩니다.

function* g4() {
  yield* [1, 2, 3];
  return "foo";
}

let result;

function* g5() {
  result = yield* g4();
}

let iterator = g5();

console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: undefined, done: true },
// g4() 는 여기서 { value: "foo", done: true }를 반환합니다

console.log(result); // "foo"

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/yield*

 

yield* - JavaScript | MDN

yield* 표현식은 다른 generator 또는 이터러블(iterable) 객체에 yield를 위임할 때 사용됩니다.

developer.mozilla.org