ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVASCRIPT-모던자바스크립트] 심볼형2
    Javascript& React study 2021. 11. 6. 18:34
    728x90
    반응형
    SMALL

    숨김 프로퍼티

    심볼을 이용하게 되면 '숨김(hidden)' 프로퍼티를 만들 수 있다. 숨김 프로퍼티는 외부 코드에서 접근이 불가능하고 값도 덮어쓸 수 없는 프로퍼티이다.

    서드파티 코드에서 가지고 온 user라는 객체가 여러 개 있고 user를 이용해 어떤 작업을 해야 하는 상황이라고 가정해보자. user에 식별자를 붙여주도록 하자.

    식별자는 심볼을 이용해서 만들도록 한다.

    let user = { // 서드파티 코드에서 가져온 객체 
    	name : "John"
    };
    
    let id = Symbol("id");
    
    user[id] = 1;
    
    alert( user[id] ); // 심볼을 키로 사용해 데이터에 접근할 수 있다.

    문자열 "id"를 키로 사용해도 상관은 없는데 Symbol("id")을 사용하는 이유는?

    user는 서드파티 코드에서 가지고 온 객체이므로 함부로 새로운 프로퍼티를 추가할 수 없다. 그렇지만 심볼은 서드파티 코드에서 접근할 수 없기 때문에 심볼을 사용하게 되면 서드파티 코드가 모르게 user에 식별자를 부여할 수 있다. 

    제 3의 스크립트인 (자바스크립트 라이브러리 등)에서 user를 식별해야 하는 상황이 벌어졌다고 해보자 user의 원천이 되는 서드파티 코드, 현재 작성중인 스크립트, 제 3의 스크립트가 각자 서로의 코드도 모른 채 user를 식별해야 하는 상황이 벌어지게 된다.

    제 3의 스크립트에서는 Symbol("id")을 이용해서 전용 식별자를 만들어서 사용할 수 있다.

    let id = Symbol("id");
    
    user[id] = "제 3의 스크립트 id값";

    심볼은 유일성이 보장이 되므로 우리가 만든 식별자와 제 3의 스크립트에서 만든 식별자가 충돌하지 않는다. 이름이 같다고 하더라도 말이다. 

    심볼 대신에 문자열 "id"를 사용해서 식별자를 만들었다고 한다면 충돌이 발생할 가능성이 많다.

    let user = { name : "John" };
    
    // 문자열 "id"를 사용해 식별자를 만들었습니다.
    user.id = "스크립트 id값";
    
    // 만약 제 3의 스크립트가 우리 스크립트와 동일하게 문자열 "id"를 이용해서 식별자를 만들었다면..
    
    user.id = "제3 스크립트 id 값"
    // 의도치 않게 값이 덮어 쓰여서 우리가 만든 식별자는 무의미해진다.

    Symbols in a literal

    객체 리터럴 {...}을 사용해 객체를 만든 경우,대괄호를 사용해 심볼형 키를 만들어야 한다.

    let id = Symbol("id");
    
    let user = {
    	name : "John",
        [id]: 123 // :"id": 123은 안됨
    };

    "id: 123"이라고 한다면 심볼 id가 아니라 문자열 "id"가 키가 된다.

    728x90
    반응형
    LIST

    댓글

Designed by Tistory.