33장 7번째 데이터 타입 Symbol
33.1 심벌이란?
- 심벌은 변경 불가능한 원시타입, 중복되지 않는 유일무일한 값
33.2 심벌 값의 생성
33.2.1 Symbol함수
- 심벌값은 Symbol함수를 호출하여 생성해야 함
- 생성된 심벌 값은 외부로 노출되지 않아 확인할 수 없음
const mySymbol = Symbol();
console.log(mySymbol); // Symbol()
- new연산자로 호출하지 않음
- 심벌 값에 대한 설명이 같더라도 생성된 심벌은 유일무일한 값임
const mySymbol1 = Symbol('mySymbol');
const mySymbol2 = Symbol('mySymbol');
console.log(mySymbol1 === mySymbol2); // false
- 심벌 값은 암묵적으로 문자열, 숫자타입으로 변환되지 않지만 불리언 타입으로는 변환됨
const mySymbol = Symbol();
console.log(!!mySymbol); // true
33.2.2 Symbol.for / Symbol.keyFor메서드
1. Symbol.for메서드
- Symbol.for메서드는 인수를 키로 사용하여 전역 심벌 레지스트리에서 해당 키와 일치하는 심벌값을 검색
- 검색에 성공: 새로운 심벌값을 생성하지 않고 검색된 심벌값 반환
- 검색에 실패: 새로운 심벌값을 생성하여 전역 심벌 레지스트리에 저장한 후, 생성된 심벌값을 반환
const s1 = Symbol.for('mySymbol');
const s2 = Symbol.for('mySymbol');
console.log(s1 === s2); // true
2. Symbol.keyFor메서드
- Symbol.keyFor메서드를 사용하면 전역 심벌 레지스트리에 저장된 심벌값의 키를 추출할 수 있음
const s1 = Symbol.for('mySymbol');
Symbol.keyFor(s1); // -> mySymbol
33.3 심벌과 상수
- 값에는 의미가 없고 상수 이름 자체에 의미가 있는 경우, 중복이 없는 심벌 값으로 대체 사용할 수 있음
const Direction = {
UP: 1,
DOWN: 2,
LEFT: 3,
RIGHT: 4
};
// 심벌로 대체
const Direction = {
UP: Symbol('up');
DOWN: Symbol('down');
LEFT: Symbol('left');
RIGHT: Symbol('right');
};
33.4 심벌과 프로퍼티 키
- 객체의 프로퍼티 키는 모든 문자열, 심벌 값으로 만들 수 있고, 동적으로 생성할 수 있음
const obj = {
[Symbol.for('mySymbol')]: 1
};
obj[Symbol.for('mySymbol')]; // -> 1
33.5 심벌과 프로퍼티 은닉
- 심벌값을 프로퍼티 키로 생성한 프로퍼티는 for...in문, Object.keys, Object.getOwnPropertyNames메서드로 찾을 수 없음
- Object.getOwnPropertySymbol메서드를 사용하면 찾을 수 있음
33.6 심벌과 표준 빌트인 객체 확장
- 일반적으로 표준 빌트인 객체에 직접 메서드를 추가하는 건 메서드명이 중복될 수 있기 때문에 권장하지 않지만 심벌값으로 추가하면 안전하게 표준 빌트인 객체를 확장할 수 있음
Array.prototype[Symbol.for('sum')] = function () {
return this.reduce((acc, cur) => acc + cur, 0);
};
[1, 2][Symbol.for('sum')](); // -> 3
33.7 Well-known Symbol
- 자바스크립트가 기본 제공하는 빌트인 심벌값을 Well-Known Symbol이라 부름