숫자,문자열,불리언,객체,null,undefined 6가지 데이터 타입에 이어서
ES6에서 도입된 7번째 데이터 타입
원시 타입의 값이고 다른 값과 중복되지 않는 유일무이한 값
리터럴로 생성 불가, Symbol 함수를 호출해야만 생성 가능
생성되는 심벌 값은 외부로 노출되지 않아 확인이 불가능
아무튼 유일무이한 값임
객체처럼 접근시 래퍼 객체 생성됨
암묵적으로 문자열이나 숫자 타입으로 변환되지 않음, 불리언으로는 됨
const x = Symbol();
console.log(x); // Symbol() 값이 안보임
new Symbol(); // 에러
const a = Symbol('a'); // 문자열을 인수로 줘도 그냥 값에 대한 설명일뿐
const b = Symbol('b');
console.log(a===b); // false
a+' '; // Cannot convert a Symbol value to a string
+a; // Cannot convert a Symbol value to a number
if (a) console.log('불리언으로 타입변환 가능');
Symbol.for 메서드는 전달받은 인수를 키로 사용하여 키-심벌값 쌍들이 저장되어 있는 전역 심벌 레지스트리에서 해당 키와 일치하는 심벌 값을 검색
검색에 성공하면 검색된 심벌 값을 반환
실패하면 새로운 심벌 값을 생성하여 전역 심벌 레지스트리에 등록 후 심벌 값을 반환
Symbol 함수는 호출될 때마다 심벌 값을 생성하게 되는데 이 때 전역 심벌 레지스트리에 등록되지는 않음
Symbol.for 메서드는 전역 심벌 레지스트리에 등록됨
Symbol.keyFor 메서드는 전역 심벌 레지스트리에 등록된 심벌 값의 키를 반환
const x = Symbol.for('심벌 값 x의 키');
Symbol.keyFor(x); // 심벌 값 x의 키
값에는 의미가 없고 이름에 의미가 있을 때
상수 값이 실수로 중복이 될 수도 있으니 심벌 값을 이용하면 좋음
const Direction={
UP : 1,
DOWN : 2,
LEFT : 3,
RIGHT : 4
}
const NewDirection={
UP : Symbol('up'),
DOWN : Symbol('down'),
LEFT : Symbol('left'),
RIGHT : Symbol('right')
}
객체의 프로퍼티 키로 심벌 값도 가능
심벌 값을 대괄호로 감싸줘야 가능함
const obj = {
[Symbol.for('age')] : 20
}
obj[Symbol.for('age')]; // 20
객체에 프로퍼티 키로 심벌 값을 사용하면 Object.keys 메서드로 찾아도 안나옴
Object.getOwnPropertySymbols 에는 나옴
표준 빌트인 객체에 사용자 정의 메서드를 추가하는 것은 Bad
미래에 추가되는 메서드명이 똑같으면 문제가 발생하기 때문
만약 굳이 표준 빌트인 객체에 메서드를 추가하고 싶다면 심벌 값으로... 유일무이한 값이니까
Array.prototype.sum = function(){
return this.reduce((acc,cur)=>acc+cur,0);
}
[1,2,3].sum();
Array.prototype[Symbol.for('sum')] = function(){
return this.reduce((acc,cur)=>acc+cur,0);
}
[1,2,3][Symbol.for('sum')]();
자바스크립트가 기본 제공하는 빌트인 심벌 값을 Well-known Symbol 이라 함
자바스크립트 엔진 내부 알고리즘에 사용됨