심볼(symbol) 값은 ES6에서 도입된 새로운 원시 자료형(primitive type)입니다. 심볼은 고유하고 수정 불가능한 값을 나타내며, 객체의 속성 이름으로 사용될 수 있습니다.
심볼 값은 Symbol() 생성자 함수나 Symbol.for() 정적 메서드를 사용하여 생성할 수 있습니다. Symbol() 생성자 함수로 생성한 심볼 값은 항상 고유하며, Symbol.for() 정적 메서드로 생성한 심볼 값은 전역 심볼 레지스트리(global symbol registry)에 저장되어, 동일한 이름의 심볼 값을 공유할 수 있습니다.
아래는 심볼 값을 생성하고, 객체의 속성 이름으로 사용하는 예시 코드입니다.
const mySymbol = Symbol();
const myObject = {};
myObject[mySymbol] = 'Hello, World!';
console.log(myObject[mySymbol]); // 'Hello, World!'
위 코드에서는 Symbol() 생성자 함수를 사용하여 mySymbol 심볼 값을 생성하고, 객체 리터럴을 사용하여 myObject 객체를 생성하고 있습니다. myObject 객체의 속성 이름으로 mySymbol 심볼 값을 사용하여 'Hello, World!' 값을 저장하였습니다. mySymbol 심볼 값을 사용하면, 다른 속성 이름과 구분되는 고유한 속성 이름을 만들 수 있습니다.
따라서, 심볼 값은 고유하고 수정 불가능한 값을 가지며, 객체의 속성 이름으로 사용될 수 있습니다.
Symbol 함수를 이용하여 직접 심볼을 생성하고 사용할 수도 있지만, 특별한 용도로 사용되기 위해 JavaScript 엔진 내에 미리 생성되어 상수로 존재하고 있는 내장 심볼(Built-in Symbol)들도 존재한다. 이들은 Symbol 함수의 프로퍼티로서 존재한다(Symbol 함수도 객체의 일종이기 때문에 프로퍼티를 가질 수 있음).
내장 심볼의 가장 대표적인 예시가 바로 Symbol.iterator이다. JavaScript 엔진은 이 심볼을 키로 갖는 메소드가 정의된 객체를 iterable 객체로 인식한다. iterable 객체로 인식되는 객체들만 for ... of 문법 등을 이용한 반복이 가능하다. Symbol.iterator를 키로 갖는 메소드를 정의해둔 내장 iterable 객체들의 예시로는 다음과 같은 것들이 있다.