ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Javascript 200] Symbol
    To infinity/Javascript 이론 2021. 6. 27. 14:05

    symbol은 리터럴표기법으로 값을 생성할 수가 없고 symbol함수로만 값을 생성할 수 있다.

    const mysymbol = symbol()

     

    마치 생성자함수같아 보이지만 생성자함수는 new 연산자와 함께 호출해야한다.

    생성자함수 또는 클래스는 값으로 객체(인스턴스)가 생성되지만 심벌 값은 원시값이다.

     

    선택적으로 문자열을 인수로 전달할 수 있지만 설명으로 디버깅용도로만 쓰이지 심벌값 생성에 어떤 영향도 주지 않는다.

     

    symbol은 암묵적으로 문자열이나 숫자로 변환되지 않는다.

    단, 불리언타입으로는 암묵적으로 변환이 된다.

     

    그럼 대체 symbol은 뭘 하는거지? 어떤 값이 들어가는거지?

     

    2. 함수

    symbol.for('문자열(key)')

    - 인수로 전달받은 문자열을 키로 사용해서

    키와 심벌 값의 쌍들이 저장되어있는 전역 심벌 레지스트리에서 해당키와 일치하는 심벌 값을 검색한다.

    -> 검색에 성공하면 검색된 심벌 값을 반환한다.

    -> 검색에 실패하면 새로운 심벌 값을 생성한 후 새로 생성한 심벌 값을 반환한다.

     

    => 아, 객체랑 비슷하게 키와 값을 매칭해놓는구나. 근데 그 매칭한 값을 우리한텐 안 보여주는거고.

     

    const s1 = symbor('mysymbol'); //새로운 심벌값 생성

    const s2 = symbor('mysymbol'); //새로운 심벌값 생성

    console.log(s1 === s2); //false

    //저역 심벌 레지스트리에 등록 안함, 따라서 저장된 심벌 값의 키 추출 안됨.

     

    const s1 = symbor.for('mysymbol'); //새로운 심벌값 생성 및 반환

    const s2 = symbor.for('mysymbol'); //해당 키와 일치하는 값이 있으니 기존 심벌값 반환

    console.log(s1 === s2); //true

    // 전역 심벌 레지스트리에 저장하여 관리, 저장된 심벌 값의 키 추출

     

     

    값 말고 이름(키값)의 의미가 더 중요할 때, symbol을 사용.

    중복가능성이 없는 심벌값으로 상수를 정의하면 상수값이 변경되지 않으니까 안정적임.

     

    3. enum

    - 명명된 숫자 상수의 집합으로 열거형이라고 부름

    - 자바스크립트는 해당 기능을 지원하지 않으므로 동 기능을 구현하고 싶다면 객체를 동결하는 Object.freeze메서드와 심벌값을 사용하면 됨.

     

     

     

    4. 심벌 값으로 프로퍼티 키를 생성하려면 대괄호 []를 해야한다.

    -> 심벌 값은 유일무이한 값이므로 프로퍼티 키를 만들면 다른 프로퍼티 키와 절대 충돌하지 않는다.

    -> 심벌 값을 프로퍼티키로 만들어 생성한 프로퍼티는 for..in문이나 Object.keys, Object.getOwnPropertyNmes메서드로 찾을 수 없다.노출할 필요가 없는 프로퍼티를 은닉할 수 있다.

    -> but, ES6에 도입된 Object.getOwnPropertySymbols 메서드를 사용하면 심벌 값을 프로퍼티키로 사용하여 생성한 프로퍼티를 찾을 수 있음.

     

     

     

    5. 표준빌트인 객체 확장

    - 원래는 표준 빌트인 객체를 직접 메서드 정의를 추가해서 확장하는 것은 좋지 않지만

    심벌값을 사용해서 표준 빌트인 객체를 확장하면 중복가능성이 없기 때문에 안전하게 확장할 수 있다.

     

     

    6. well-known symbol

    - 자바스크립트가 기본제공하는 빌트인 심벌값을 부르는 이름 in ECMAscript

     

     

     

Designed by Tistory.