심볼형

자바스크립트는 객체 프로퍼티의 키로 오직 문자형과 심볼형만 허용한다. 숫자형, 불린형 모두 불가능하다는 특징을 가진다. 위에서는 객체 프로퍼티의 키가 문자형인 경우만 살펴보았지만, 아래에서부터는 프로퍼티 키로 심볼값을 사용하여 살펴본다.

심볼(symbol)은 원시형 데이터로, 유일한 식별자를 만들고 싶을 때 사용한다.

Symbol()을 사용하면 심볼값을 만들 수 있다. (new를 붙이지 않아도 된다. 생성자가 아니라는 뜻이다.)

심볼을 만들 때에는 심볼 이름이라는 설명을 붙일 수 있다. 심볼 이름은 디버깅 시 아주 유영하다. 이는 유일성이 보장되는 자료형이기 때문에 이름이 동일한 심볼을 여러 개 만들어도 각 심볼값은 다르다. 심볼에 붙이는 이름은 어떤 것에도 영향을 주지 않는 이름표 역할만 한다.

이름이 같은 심볼 두 개를 만들고 이 둘을 동일 연산자(==)로 비교 시 false가 반환되는 것을 확인할 수 있다.

let id1 = Symbol("id");
let id2 = Symbol("id");
alert(id1 == id2); // false

다른 자료형은 문자형으로 암시적 형 변환이 자유롭게 일어나지만, 심볼형 값은 문자형으로 자동 형 변환되지 않는다. 심볼을 반드시 출력해야 하는 상황이라면 .toString() 메서드를 이용하여 명시적으로 호출하면 된다.

symbol.description 프로퍼티를 이용하면 이름만 보여주는 것도 가능하다.

let id = Symbol("id");
alert(id.toString()); // Symbol(id)가 얼럿 창에 출력됨.

alert(id.description); // id가 얼럿 창에 출력됨.

객체의 키로 사용할 때, 객체 리터럴을 사용해서 객체를 만들 경우에는 [ , ] 로 감싸서 사용한다.

const obj = {
	[Symbol('x')]: 1,
	[Symbol('y')]: 2
}

// 유일무이한 값이므로 다음과 같이 출력할 수 없다.
console.log(
	obj[Symbol('x')]
);

심볼은 외부 접근을 제한할 프로퍼티의 키로 활용하기도 한다. 객체[키]를 이용하여 사용하는 것이 불가능하다는 특징을 이용한다.

const buildingKey = Symbol('secret');

const building = {
	name: '김민아',
	floors: 3,
	[buildingKey]: '1234#'
}

console.log(
	building[Symbol('secret')] // 외부로부터의 접근 차단. undefined
);

for (key in building) {
	console.log(key);
} // name과 floors가 출력됨. 심볼 키 접근 불가

console.log(
	Object.keys(building),
	Object.values(building),
	Object.entries(building),
	Object.getOwnPropertyNames(building)
); /*
['name', 'floors']
['김민아', 3]
[ ['name', '김민아'], ['floors', 3]]
['name', 'floors']
*/

console.log(
	Object.getOwnPropertySymbols(building),
	Object.getOwnPropertySymbold(building)[0],
); // 이렇게 Object의 정적 메서드로 접근 가능. (배열로 반환됨)