iterable 객체

황성호·2021년 3월 1일
0

배열을 일반화한 객체
이터러블 이라는 개념을 사용하면 어떤 객체에든 for..of 반복문을 적용할 수 있습니다.

Symbol.iterator

let range = {
  from: 1,
  to: 5
};

// 아래와 같이 for..of가 동작할 수 있도록 하는 게 목표입니다.
// for(let num of range) ... num=1,2,3,4,5

range를 이터러블로 만들려면(for..of가 동작하도록 하려면) 객체에 Symbol.iterator(특수 내장 심볼)라는 메서드를 추가해야함
1.for..of가 시작되자마자 for..of는 Symbol.iterator를 호출합니다(Symbol.iterator가 없으면 에러가 발생합니다). Symbol.iterator는 반드시 이터레이터(iterator, 메서드 next가 있는 객체) 를 반환해야 합니다.
2.이후 for..of는 반환된 객체(이터레이터)만을 대상으로 동작합니다.
3.for..of에 다음 값이 필요하면, for..of는 이터레이터의 next()메서드를 호출합니다.
4.next()의 반환 값은 {done: Boolean, value: any}와 같은 형태이어야 합니다. done=true는 반복이 종료되었음을 의미합니다. done=false일땐 value에 다음 값이 저장됩니다.

let range = {
  from: 1,
  to: 5,

  [Symbol.iterator]() {
    this.current = this.from;
    return this;
  },

  next() {
    if (this.current <= this.to) {
      return { done: false, value: this.current++ };
    } else {
      return { done: true };
    }
  }
};

for (let num of range) {
  alert(num); // 1, then 2, 3, 4, 5
}

문자열은 이터러블입니다
배열과 문자열은 가장 광범위하게 쓰이는 내장 이터러블입니다.

for..of는 문자열의 각 글자를 순회합니다.

for (let char of "test") {
  // 글자 하나당 한 번 실행됩니다(4회 호출).
  alert( char ); // t, e, s, t가 차례대로 출력됨
}

서로게이트 쌍

let str = '𝒳😂';
for (let char of str) {
    alert( char ); // 𝒳와 😂가 차례대로 출력됨
}

Array.from
Array.from는 이터러블이나 유사 배열을 받아 ‘진짜’ Array를 만듦

let arrayLike = {
 0: "Hello",
 1: "World",
 length: 2
};

let arr = Array.from(arrayLike); // (*)
alert(arr.pop()); // World (메서드가 제대로 동작합니다.)

Array.from엔 ‘매핑(mapping)’ 함수를 선택적으로 넘겨줄 수 있음

Array.from(obj[, mapFn, thisArg])

let arr = Array.from(range);
alert(arr); // 1,2,3,4,5 (배열-문자열 형 변환이 제대로 동작합니다.)

let arr = Array.from(range, num => num * num);

alert(arr); // 1,4,9,16,25

let str = '𝒳😂';

// str를 분해해 글자가 담긴 배열로 만듦
let chars = Array.from(str);

alert(chars[0]); // 𝒳
alert(chars[1]); // 😂
alert(chars.length); // 2
profile
개발!

1개의 댓글

comment-user-thumbnail
2021년 3월 2일

이터러블과 유사배열의 개념, 유사배열의 경우 중간에 수가 하나 빠지면 어떻게 될지

답글 달기