
자바스크립트의 Symbol은 ES6에 도입된 7번째 원시 데이터 타입으로 다른 값과 중복되지 않는 유일무이한 값을 생성할 수 있다. 이번 포스팅에서는 Symbol에 대해 자세히 정리하고 넘어가보자.
Symbol() 함수를 호출하여 생성한다. (리터럴 표기법 X)new 연산자와 함께 호출하지 않는다. (심벌 값은 변경 불가능한 원시 값이다.)const mySymbol = Symbol();
console.log(typeof mySymbol); // Symbol
// 심벌 값은 외부로 노출되지 않아 확인할 수 없다.
console.log(mySymbol); // Symbol()
const sym1 = Symbol('id');
const sym2 = Symbol('id');
console.log(sym1 === sym2); // false
const mySymbol = Symbol();
console.log(mySymbol + ''); // TypeError: Cannot convert a Symbol value to a string
console.log(+mySymbol); // TypeError: Cannot convert a Symbol value to a number
console.log(!mySymbol); // false
Symbol.for()와 Symbol.keyFor()를 사용하면 전역 심벌 레지스트리에서 Symbol을 검색하거나 생성할 수 있다.Symbol.for 메서드의 인수로 전달된 키로 전역 심벌 레지스트리에 저장한 후, 생성된 심벌 값을 반환한다.Symbol.keyFor 메서드를 사용하면 전역 심벌 레지스트리에 저장된 심벌 값의 키를 추출할 수 있다.const globalSym1 = Symbol.for('app.uniqueId');
const globalSym2 = Symbol.for('app.uniqueId');
console.log(globalSym1 === globalSym2); // true
console.log(Symbol.keyFor(globalSym1)); // 'app.uniqueId'
const uniqueId = Symbol('myUniqueId');
const user = {
name: "Sean",
[uniqueId]: 123 // Symbol을 키로 사용
};
console.log(user[uniqueId]); // 123
for...in 문이나 Object.keys, Object.getOwnPropertyNames 메서드로 찾을 수 없다.Object.getOwnPropertySymbols 메서드를 사용하면 심벌 값을 프로퍼티 키로 사용하여 생성한 프로퍼티를 찾을 수 있다.const uniqueId = Symbol('myUniqueId');
const user = {
name: "Sean",
[uniqueId]: 123 // Symbol을 키로 사용
};
console.log(user[uniqueId]); // 123
for (const key in user) {
console.log(key); // 아무것도 출력되지 않는다.
}
console.log(Object.keys(user)); // []
console.log(Object.getOwnPropertyNames(user)); // []
console.log(Object.getOwnPropertySymbols(user)); // [ Symbol(myUniqueId) ]
for...of 루프에서 객체를 순회할 수 있도록 객체의 반복 동작을 설정할 때 사용한다.const iterableObj = {
data: [1, 2, 3],
[Symbol.iterator]() {
let index = 0;
const data = this.data;
return {
next() {
return index < data.length
? { value: data[index++], done: false }
: { done: true };
}
};
}
};
for (const value of iterableObj) {
console.log(value); // 1, 2, 3
}