javascript의 Symbol

JY KIM·2020년 6월 6일
0

vanilla javascript

목록 보기
2/8

Symbol

'유일한 식별자'를 만들고 싶을 때 사용한다.

사용법 : Symbol();

let temp = Symbol(); // 새로운 Symbol 만들기

let temp2 = Symbol('super'); // 'super'라는 설명을 붙인 Symbol temp2

'유일한 식별자' 를 만들고 싶을 때 사용한다는 것은 아래와 같은 것을 의미한다.

let o = Symbol('abc');
let t = Symbol('abc');

console.log(o === t); // false

Symbol을 통해서 얻으려고 한 것은 무엇일까?

'symbol'을 이용해 Hidden property 만들기

외부에서 데이터를 가지고 왔을 경우, 데이터 핸들링을 해줘야 하는 경우가 생길 때 Symbol을 사용해서 식별자를 추가할 수 있다.

let user = {
  name: 'super'
}

let s = Symbol('id');
user[s] = 'test';
console.log(user[s]); // 'test';

외부에서 받아온 user데이터에 추가할 데이터가 생길 경우, 원본데이터는 그대로 두고 프로퍼티를 추가할 수 있는 방법이 될 수 있다.

여러가지 실험

let user = {
  sample : 'babo'
}

let op = Symbol('ccc');

user[op] = 314

console.log(user[op]); // 314

user[Symbol()] = 'abc';

console.log(user);	// {name:'babo', Symbol():314, Symbol():'abc'}

user[Symbol()] // <-- undefined가 뜬다.. 왜지? 그럼 어떻게 'abc'에 접근하지?

이때 user[op]는 고유한 식별자로서 처리된다.
user.opuser[op]는 다르다.

객체 생성을 리터럴로 사용해서 할 경우

  • Symbol을 프로퍼티 이름으로 사용할 경우 대괄호를 사용해야 한다.
let id = Symbol('id');

let user = {
  name: 'super',
  [id]:123,
  id:1233
}
console.log(user); // {name:'super', Symbol(id):123, id:1233}
user.id // 1233
user[id] // 123

Symbol 유의점

  • 객체의 key가 Symbol일 경우, for..in 반복문에서는 배제된다.
  • Object.keys 를 사용해도 키가 심볼인 프로퍼티는 배제된다.
    '심볼평 프로퍼티 숨기기(hiding symbolic property) 원칙
    외부 스크립트나 라이브러리는 Symbol형 키를 가진 프로퍼티에 접근 하지 못함
    Object.assign은 예외?
    Symbol 키를 가진 프로퍼티도 복사한다.
profile
알파카머리닮음

0개의 댓글