[JS] iterable 객체

학미새🐥·2023년 5월 5일
0

모던자스 정리

iterable 객체

  • 반복 가능한 객체 라는 뜻
  • 배열을 일반화한 객체
  • 어떤 객체에도 for..of 반복문을 사용할 수 있게 됨
  • 배열, 문자열 모두 해당됨

배열이 아닌 객체에서 for..of를 사용해보자

Symbol.iterator

  • for..of가 Symbol.iterator를 호출하면 iterator 객체가 반환된다.
  • for..of는 iterator를 대상으로 실행된다.
  • for..of에서 다음값이 필요할 땐 iterator 객체 내의 메서드인 next()를 호출한다.
  • next()의 반환값은 {done: Boolean, value: any}
    • done : 순회가 종료되었는지
    • value : 종료되지 않았으면 다음 값

즉, 반복이 불가능한 객체더라도
객체[Symbol.iterator]()를 호출해서 iterator 객체를 만들고
그 메서드인 next() 함수를 정의해서 반복 시 다음 값을 어떻게 만들어낼지 설정하면 된다.

문자열 iterable

문자열도 배열과 같은 iterable이고, 따라서 for..of도 가능하다.
-> 문자열의 각 글자를 순회한다.

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

for .. of를 쓰지 않고 명시적으로 Symbol.iterator를 호출할 수 있다.

let str = "Hello";

// for..of를 사용한 것과 동일한 작업을 합니다.
// for (let char of str) alert(char);

let iterator = str[Symbol.iterator]();

while (true) {
  let result = iterator.next();
  if (result.done) break;
  alert(result.value); // 글자가 하나씩 출력됩니다.
}

iterable과 유사 배열

  • iterable : Symbol.iterator 메서드가 구현된 객체

  • 유사 배열 : 인덱스, length가 있어서 배열같이 동작하는 객체

  • iterable 객체와 유사 배열은 다른 분류이고, 두 분류 모두에 포함되는 객체가 문자열이다.

  • iterable과 유사 배열 모두, 실제 배열은 아니기 때문에 배열 메서드인 push, pop 등은 불가능하다.

Array.from

  • Array.from은 이터러블 객체나 유사 배열을 진짜 배열로 만들어주고, 그럴 경우 불가능했던 배열 메서드인 push, pop 모두 가능해진다.
let arrayLike = {
  0: "Hello",
  1: "World",
  length: 2
};

let arr = Array.from(arrayLike); // (*)
alert(arr.pop()); // World (메서드가 제대로 동작합니다.)
profile
뭐든 다해보려는 공대생입니다

0개의 댓글