JavaScript에서 기호는 개체 속성에 대한 식별자를 만드는 데 사용할 수 있는 고유한 데이터 유형입니다. 기호는 문자열이나 숫자와 다르며 해당 데이터 유형으로 변환할 수 없습니다. 이것이 식별자를 만드는 데 이상적입니다.
자바스크립트에서 기호 사용
기호를 생성할 때 선택적으로 설명을 제공할 수 있습니다. 이것은 디버깅에 유용하지만 필수는 아닙니다.
심볼을 만드는 것은 간단합니다.
const mySymbol = Symbol();
설명이 있는 기호를 만들 수도 있습니다.
const mySymbol = Symbol("my description");
동일한 설명으로 여러 기호를 생성하면 값이 다릅니다.
const sym1 = Symbol("foo");
const sym2 = Symbol("foo");
// false
console.log(sym1 === sym2);
Symbols를 독특하게 만드는 요소
기호는 종종 객체 속성의 식별자로 사용됩니다. 이는 기호가 고유한 것으로 보장되고 문자열로 변환되지 않기 때문입니다.
const obj = {};
obj[mySymbol] = "bar";
// "bar"
console.log(obj[mySymbol]);
기호를 객체 속성의 키로 사용할 수 있지만 JSON에서는 속성 이름(키)으로 사용할 수 없습니다.
const sym = Symbol("foo");
const obj = { [sym]: "bar" };
// {}
console.log(JSON.stringify(obj));
기호는 열거할 수 없으므로 개체에 for-in 루프를 사용할 때 표시되지 않습니다.
const obj = {};
obj[Symbol("a")] = "a";
obj[Symbol("b")] = "b";
for (var key in obj) {
// undefined
console.log(key);
}
Object.getOwnPropertySymbols를 사용하여 개체의 모든 기호 배열을 가져올 수 있습니다.
const obj = {};
obj[Symbol("a")] = "a";
obj[Symbol("b")] = "b";
const symbols = Object.getOwnPropertySymbols(obj);
// [Symbol(a), Symbol(b)]
console.log(symbols);
심볼을 반복자로 사용하기
잘 알려진 Symbol.iterator를 사용하여 반복자로 사용할 수 있는 기호를 얻을 수 있습니다.
const arr = [1, 2, 3];
const it = arr[Symbol.iterator]();
// { value: 1, done: false }
console.log(it.next());
// { value: 2, done: false }
console.log(it.next());
// { value: 3, done: false }
console.log(it.next());
// { value: undefined, done: true }
console.log(it.next());
보다 실제적인 예
고유한 기호를 만들 수 있지만 고유성을 보장할 수 있는 방법은 없습니다. 고유한 기호가 필요한 경우 Symbol()을 사용해야 합니다.
사람을 나타내는 개체가 있다고 가정합니다. 사람의 출생 연도를 저장하는 이 개체에 속성을 추가하고 싶지만 이 속성을 열거할 수 있는 것은 원하지 않습니다. 다음과 같은 기호를 사용하여 이 작업을 수행할 수 있습니다.
const person = {
name: "John Doe"
};
const birthYear = Symbol("birth year");
person[birthYear] = "1955";
for (var key in person) {
// name
console.log(key);
}
// 1955
console.log(person[birthYear]);