자바스크립트의 심볼

기호 알아보기: 개체 속성의 고유 데이터 유형

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]);