본문 바로가기

TIL(Today I Learned)/2024.09

[TIL] 9.28

1. JS

 

1- 1)  iterable iterator protocol

 

  const iterable = {
    [Symbol.iterator](){
      let i = 3;
      return {
        next(){
          return i === 0 ? {value:undefined, done:true} : {value:i--, done:false};
        },
        // 이터러블도 이터레이터를 반환해야 well-formed 이터레이터가 될 수 있다
        [Symbol.iterator](){
          return this;
        }
      }
    }
  }
  let iter2 = iterable[Symbol.iterator]();
  log(iter2.next()); // {value: 3, done: false}
  for( const a of iter2) log(a); // 2, 1

 

사용자 정의 이터러블은 자기자신을 이터레이터로 반환하는 코드까지 추가해야

 [Symbol.iterator](){
          return this;
 }

 

이터레이터로 next() 메서드를 호출하고 다음 로그를 찍었을 때 이어서 로그를 출력할 수 있게 된다

 

  let iter2 = iterable[Symbol.iterator]();
  log(iter2.next()); // {value: 3, done: false}
  for( const a of iter2) log(a); // 2, 1

 

 

( 기존 Symbol.iterator 를 갖고 있는 map set array 도 이와 같은 동작을 한다)

 

1-2 )  제너레이터 리마인드

 

https://2ality.com/2015/03/es6-generators.html

 

ES6 generators in depth

ES6 generators in depth (Ad, please don’t block) This blog post is outdated. Please read chapter “Generators” in “Exploring ES6”. This blog post is part of a series on iteration in ES6: Iterables and iterators in ECMAScript 6 ES6 generators in de

2ality.com

 

function* generateSequence() {
  yield 1;
  yield 2;
  return 3;
}

let generator = generateSequence();

for(let value of generator) {
  alert(value); // 1, 2가 출력됨
}

3은 출력되지 않는 이유는 for..of 이터레이션이 done: true일 때 마지막 value를 무시하기 때문입니다. 

그러므로 for..of를 사용했을 때 모든 값이 출력되길 원한다면 yield로 값을 반환해야 합니다.

 

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

let generator = generateSequence();

for(let value of generator) {
  alert(value); // 1, 2, 3
}

 


1-3) *yeild 에 대하여

https://daunje0.tistory.com/153

 

[JavsScript] yield* 란?

yield*는 하나의 표현식입니다. 여기서 *는 yield와 함께 특별한 의미를 가집니다.ECMAScript 명세에 따르면, yield*는 "YieldExpression"의 한 형태로 정의됩니다. yield*는 뒤에 오는 제너레이터나 이터러블

daunje0.tistory.com

 

 

'TIL(Today I Learned) > 2024.09' 카테고리의 다른 글

[TIL] 9.30  (0) 2024.09.30
[TIL] 9.29  (0) 2024.09.30
[TIL] 9.26  (0) 2024.09.26
[TIL] 9.25  (0) 2024.09.25