Symbol.iterator 정적 데이터 프로퍼티

Symbol.iterator 정적 데이터 프로퍼티

Symbol.iterator는 JavaScript의 잘 알려진 심볼(well-known symbol) 중 하나로, 객체에서 이터레이터(iterator)를 반환하는 메서드를 찾기 위해 이터러블 프로토콜이 조회하는 심볼입니다. 객체가 이터러블(iterable)이 되려면 [Symbol.iterator] 키를 반드시 가져야 합니다.

출처: Symbol.iterator - MDN Web Docs

본문

개요

Symbol.iterator 정적 데이터 프로퍼티는 잘 알려진 심볼 Symbol.iterator를 나타냅니다. 이 심볼은 객체의 이터레이터를 반환하는 메서드를 찾는 데 사용됩니다. for...of 루프와 전개 구문 등이 내부적으로 이 심볼을 통해 객체를 순회합니다.

기본적인 사용 예는 다음과 같습니다.

const iterable = {};

iterable[Symbol.iterator] = function* () {
  yield 1;
  yield 2;
  yield 3;
};

console.log([...iterable]);
// Expected output: Array [1, 2, 3]

값(Value)

잘 알려진 심볼 Symbol.iterator입니다.

Symbol.iterator의 프로퍼티 속성:

프로퍼티 속성
Writable no
Enumerable no
Configurable no

설명(Description)

객체를 반복(iterated)해야 할 때마다(예: for...of 루프의 시작 시점) 그 객체의 [Symbol.iterator]() 메서드가 인자 없이 호출되고, 반환된 이터레이터가 반복할 값들을 얻는 데 사용됩니다.

일부 내장 타입은 기본 반복 동작을 갖지만, 다른 타입(예: Object)은 그렇지 않습니다. [Symbol.iterator]() 메서드를 가진 내장 타입은 다음과 같습니다.

  • Array.prototype[Symbol.iterator]()
  • TypedArray.prototype[Symbol.iterator]()
  • String.prototype[Symbol.iterator]()
  • Map.prototype[Symbol.iterator]()
  • Set.prototype[Symbol.iterator]()

자세한 내용은 Iteration protocols(반복 프로토콜)을 참조하세요.

예제

사용자 정의 이터러블(User-defined iterables) — 우리만의 이터러블을 만들 수 있습니다.

const myIterable = {};
myIterable[Symbol.iterator] = function* () {
  yield 1;
  yield 2;
  yield 3;
};
[...myIterable]; // [1, 2, 3]

혹은 계산된 프로퍼티(computed property)를 사용해 클래스나 객체 내부에 직접 이터러블을 정의할 수도 있습니다.

class Foo {
  *[Symbol.iterator]() {
    yield 1;
    yield 2;
    yield 3;
  }
}

const someObj = {
  *[Symbol.iterator]() {
    yield "a";
    yield "b";
  },
};

console.log(...new Foo()); // 1, 2, 3
console.log(...someObj); // 'a', 'b'

비정형(non-well-formed) 이터러블 — 이터러블의 [Symbol.iterator]() 메서드가 이터레이터 객체를 반환하지 않으면 이는 비정형 이터러블입니다. 이를 그대로 사용하면 런타임 예외나 버그성 동작이 발생할 가능성이 높습니다.

const nonWellFormedIterable = {};
nonWellFormedIterable[Symbol.iterator] = () => 1;
[...nonWellFormedIterable]; // TypeError: [Symbol.iterator]() returned a non-object value

더 알아보기