2021 프론트 엔드 로드맵 따라가기/JS
ES6 Symbol
알 수 없는 사용자
2021. 6. 15. 23:30
Symbol은 ES6에서 추가된 primitive data type 입니다.
각각의 Symbol들은 같을 수 없습니다.
Symbol은 객체의 프로퍼티 식별자(프로퍼티의 key)로 이용하기 위해 만들어졌다고 합니다.
for .. in 문을 통해 열거할 수 없고, JSON.stringify 메서드를 이용해 JSON으로 변경할 수 없어 해당 프로퍼티를 감추는 용도로 사용합니다. 해당 프로퍼티의 값에 접근하려면 값의 할당에 쓰였던 Symbol이 있어야하기 때문이죠. ( ex. obj[KEY1] )
아래의 코드를 참조하여 특성에 대해 알아보아요.
// Create a symbol
const sym1 = Symbol();
const sym2 = Symbol("sym2");
console.log(sym1);
console.log(sym2);
// primitive type
console.log(typeof sym2);
// 각 Symbol 들은 같을 수가 없다.
console.log(Symbol() === Symbol()); // false
console.log(Symbol("123") === Symbol("123"));
console.log(`Hello ${String(sym1)}`);
// Unique Object Keys
const KEY1 = Symbol();
const KEY2 = Symbol("sym2");
const KEY3 = "Not Symbol";
// 객체의 프로퍼티 키를 key1으로 유니크하게 갖고 싶을 경우
const obj = {};
obj[KEY1] = "Prop1"; // inenumerable, cant be JSON
obj[KEY2] = "Prop2"; // inenumerable, cant be JSON
obj.key3 = "Prop3"; // enumerable, can be JSON
obj.key4 = "Prop4"; // enumerable, can be JSON
obj["key5"] = "Prop5"; // enumerable, can be JSON
obj[KEY3] = "Prop6"; // enumerable, can be JSON
// console.log(obj[KEY1]);
// console.log(obj[KEY2]);
// Symbols are not enumerable in for... in
for(let i in obj) {
// 심볼을 프로퍼티의 키로 설정할 경우 in 반복문을 이용해 표현할 수 없다. (열거할 수 없다. == not enumerable)
console.log(`${i}: ${obj[i]}`);
}
// Symbols are ignored by JSON.stringify
console.log(JSON.stringify(obj));