Symbol 데이터 타입 #33

세나정·2023년 1월 4일
0
post-thumbnail

7번째 데이터 타입 Symbol

정의

심볼? : ES6에서 도입된 7번째 데이터 타입
변경 불가능한 원시 타입의 값으로 변경 불가능한 원시 타입의 값
다른 값과 중복되지 않는 유일무이한 값

다른 데이터 타입들은 리터럴 표기로 값을 생성하는 방면

Symbol은 함수를 통해서 생성

객체를 생성하는 것처럼 보이지만 다른 생성자들과는 달리 new 연산자를 함께 호출하지 않음

Symbol은 선택적으로 문자열을 전달할 수 있는데 이것은 심벌 값에 대한 "설명"

따라서 심벌 값 생성에 어떤 영향을 주지 않음

또한, 암묵적으로 문자열이나 숫자타입으로 변환 되지 않지만, 불리언타입으로는 암묵적으로 변환이 됨

// 전역 심벌 레지에 mySymbol이라는 키로 저장된 심벌 값이 없으면 생성
const s1 = Symbol.for('mySymbol');
// 있으면 해당 값 반환
const s2 = Symbol.for('mySymbol');

consol.log(s1 === s2) // true

심볼 함수는 호출 될 때마다 다른 심벌값을 생성하므로 JS엔진에서는 전역 심벌 레지에 등록되어 관리하지 않음 -> 그렇기 때문에 Symbol.for 메서드를 사용하여 중복되지 않는 유일무이한 상수같은 심벌을 생성하여 전역 심벌 레지에서 공유 가능!

이렇게 Symbol.for 메서드를 활용한 애는 관리가 되지만 그저 Symbol로 생성한 애는 심벌값에 접근 불가!

의미가 없는 상수에서도 Symbol을 활용하여 중복 가능성이 없도록 생성 가능

활용

이러한 심벌을 활용하여 할 수 있는 것? : 프로퍼티 은닉

심벌값을 프로퍼티 키를 사용하여 생성한 프로퍼티는 for~in, object.keys, object.getOwnPropertyNames 메서드로 찾을 수 없음.

하지만 역시 심볼과 함께 등장한 ES6 - Object.getOwnPropertySymbols 메서드를 활용하면 찾을 수 있음

ECMAScript 사양에서는 Well-Known Symbol이라고 부름 (자바스크립트 엔진 내부 알고리즘에 활용)

그렇기에 어레이, 스트링, Map, Set처럼 for...of문으로 순회 가능한 빌트인 이터러블은 Well-known Symbol인 Symbol.iterator를 키로 갖는 메서드를 갖고 Symbol.iterator 메서드를 호출하면 이터레이터를 반환하도록 규정 즉, 이터레이션 프로토콜를 준수

빌트인 이터러블이 아닌 일반 객체를 이터러블처럼 동작하도록 구현하려면 이터레이션 프로토콜을 따르면 됨.
웰노운심볼인 심볼 이터레이터를 키로 갖는 메서드를 활용하면 -> 그 객체는 이터러블이 됨!

결론

이렇게 중복되지 않은 상수값 생성, 기존 코드 미영향으로 새로운 프로퍼티 추가하기 위해
즉, 하위 호완성을 보장하기 위해 도입 됨!

profile
기록, 꺼내 쓸 수 있는 즐거움

0개의 댓글

관련 채용 정보