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
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
'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 |