/* JavaScript DAY07 2022.11.09 */

/* 심볼 (Symbol) --------------------------------------------------------------------- */
/* Symbol() */
const a = Symbol(); // 유일한 식별자를 만들 때 사용하고, new를 붙이지 않는다.
const b = Symbol();

// 위의 심볼로 선언한 a와 b를 출력해보면 같은 값이 출력된다.
console.log(a);
// 출력: Symbol()
console.log(b);
// 출력: Symbol()

// 하지만 일치 연산자로 비교해보면, false가 나온다.
a === b;
// 출력: false
a == b;
// 출력: false

// 심볼형은 '유일성'을 보장한다. <= (전체의 코드 중 딱 하나라는 말)
// 심볼형의 ()에는 문자열로 설명을 붙여 줄 수 있다.
const c = Symbol('id');
console.log(c);
// 출력: Symbol(id)

// 이러한 심볼형은  객체의 프로퍼티의 키로 사용이 가능하다. 
// [보기 01]--------------------------------------
const d = Symbol('name')
const object = {
  age: 0,
  // 컴퓨티드 프로퍼티를 활용하여 키에 심볼형을 주었다.
  [d]: 'Joonyoung'
};
console.log(object);
// 출력: { age: 0, [Symbol(name)]: 'Joonyoung' }

// 가장 큰 특징으로는 심볼형으로 준 키는, 객체의 메소드를 사용하면 심볼을 건너뛴 결과로 나온다는 점이다.
// 따라서 원본 객체의 데이터를 건드리지 않고, 속성을 추가 할 수 있는 장점이 있다.
Object.keys(object);
// 출력: [ 'age' ]


/* Symbol.for(): 전역 심볼 */
// 각각의 같은 이름이여도 다른 심볼형과는 다르게 '전역 심볼'을 줄 수 있는 함수이다.
// Symbol.for 메소는 하나를 생성한 뒤, 키를 통해 같은 Symbol을 공유한다.
const e = Symbol.for('id');
const f = Symbol.for('id');
console.log(e === f);
// 출력: true
console.log(e == f);
// 출력: true

// keyFor을 이용하여, 변수를 넣어주면 심볼을 만들 때, 적어 준 설명(?)을 알 수 있다.
Symbol.keyFor(e);
// 출력: 'id'

// 또한 전역 심볼이 아닌 심볼은 해당 메소드를 사용할 수 없다.
// 대신 description으로 이름을 알 수 있다. [보기 01 참고]
d.description;
// 출력: 'name'

/* 숨겨진 심볼의 키 보는 법 */
// 심볼을 완전히 숨길 수는 없다. 아래와 같은 방법으로 심볼들만 볼 수 있다. [보기 01 참고]
Object.getOwnPropertySymbols(object);
// 출력: [ Symbol(name) ]

// 또는 객체와 심볼을 동시에 볼 수도 있다. [보기 01 참고]
Reflect.ownKeys(object);
// 출력: [ 'age', Symbol(name) ]


/* 응용해보기 --------------------------------------------------------------------- */
// 다른 개발자가 만든 객체
const another = {
  name: 'Joonyoung',
  age: 30,
};

// 나의 작업
const showName = Symbol('show name');
another[showName] = function(){
  console.log('심볼로 만든 함수');
};

// 사용자가 접속하면 보이는 메세지
for(let key in another){
  console.log(`His ${key} is ${another[key]}.`);
}
// 내가 한 작업이 출력되지 않는 것을 볼 수 있다.
// 출력: 'His name is Joonyoung.' 'His age is 30.'

// 나의 작업한 내용이 잘 나오는 모습을 볼 수 있다.
another[showName]();
// 출력: '심볼로 만든 함수'
profile
개인 이력, 포폴 관리 및 기술 블로그 사이트 👉 https://aimzero-web.vercel.app/

1개의 댓글

comment-user-thumbnail
2022년 11월 11일

( 심볼타입을 쓰는 추가적인 이유의 예시.. )
예를 들어서 라이브러리를 만든다고 가정해보자.
만약 라이브러리를 사용하는 사용자가 이름이 겹치는 변수를 사용한다고 했을 때,
심볼 타입의 변수를 사용한 라이브러리를 만들면,
사용자가 아무리 이름이 겹치는 변수를 사용해도 문제가 되지 않는다.

답글 달기