
심볼(Symbol)은 유일한 식별자(unique identifier)를 생성하기 위한 데이터 타입이다. 심볼은 객체 프로퍼티 키로 사용할 수 있는 특별한 형식이며, 문자형과 함께 유일하게 프로퍼티 키로 사용할 수 있다.
Symbol()을 호출해 심볼을 생성한다.let id = Symbol("id"); // 설명이 "id"인 심볼 생성
let id1 = Symbol("id");
let id2 = Symbol("id");
console.log(id1 === id2); // false
let id = Symbol("id");
console.log(id); // TypeError: Cannot convert a Symbol value to a string
.toString()이나 .description을 사용해 출력 가능:console.log(id.toString()); // Symbol(id)
console.log(id.description); // id
심볼을 사용하면 객체에 외부에서 접근 불가능한 프로퍼티를 추가할 수 있다.
let user = { name: "John" };
let id = Symbol("id");
user[id] = 123;
console.log(user[id]); // 123
console.log(user["id"]); // undefined (심볼은 접근 불가능)
[])를 사용한다.let id = Symbol("id");
let user = {
name: "John",
[id]: 123 // 심볼 키 추가
};
for...in과 Object.keys()에서 제외된다.let id = Symbol("id");
let user = {
name: "John",
[id]: 123
};
for (let key in user) {
console.log(key); // "name"만 출력
}
console.log(Object.keys(user)); // ["name"]
Object.assign()은 심볼 키를 포함한 모든 프로퍼티를 복사한다.let clone = Object.assign({}, user);
console.log(clone[id]); // 123
Symbol.for(key)를 사용해 전역 심볼을 생성하거나 검색한다.let id = Symbol.for("id"); // "id" 심볼 생성
let idAgain = Symbol.for("id"); // 동일한 심볼 반환
console.log(id === idAgain); // true
Symbol.keyForlet id = Symbol.for("id");
console.log(Symbol.keyFor(id)); // "id"
Symbol.keyFor는 undefined를 반환한다.let localSymbol = Symbol("local");
console.log(Symbol.keyFor(localSymbol)); // undefined
.description으로 설명을 확인할 수 있다.console.log(localSymbol.description); // "local"
Symbol.iterator: 객체의 반복 가능성을 정의.Symbol.toPrimitive: 객체의 원시 값 변환 방식을 정의.Symbol.hasInstance, Symbol.isConcatSpreadable, Symbol.match 등.Symbol()로 생성하며, 설명을 추가할 수 있다.Symbol.for()를 통해 이름이 같은 심볼을 공유할 수 있다.for...in과 Object.keys()에서 제외되지만, Object.assign()은 포함.심볼은 주로 숨김 프로퍼티를 만들거나 고유한 식별자를 생성하기 위해 사용된다.