Symbol.iterator 정적 데이터 프로퍼티
Symbol.iterator 정적 데이터 프로퍼티
Symbol.iterator는 JavaScript의 잘 알려진 심볼(well-known symbol) 중 하나로, 객체에서 이터레이터(iterator)를 반환하는 메서드를 찾기 위해 이터러블 프로토콜이 조회하는 심볼입니다. 객체가 이터러블(iterable)이 되려면 [Symbol.iterator] 키를 반드시 가져야 합니다.
본문
개요
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
더 알아보기
- Iteration protocols(반복 프로토콜)
- for...of 루프
- [Array.prototypeSymbol.iterator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Symbol.iterator)
- [String.prototypeSymbol.iterator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Symbol.iterator)
- [Map.prototypeSymbol.iterator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/Symbol.iterator)
- Symbol.iterator 폴리필 (core-js)