기호

기호는 상대적으로 새로운 프리미티브입니다. 기호 프리미티브는 다른 기호 프리미티브의 값을 포함하여 다른 어떤 값과도 충돌하지 않습니다. 동일한 문자로 구성된 두 개의 문자열 프리미티브는 엄격하게 같음:

String() === String()
> true

String( "My string." ) === String( "My string." );
> true

그러나 Symbol() 함수를 사용하여 만든 기호 두 개는 다음과 같습니다.

Symbol() === Symbol()
> false

이 트레잇을 사용하면 객체에서 기호를 고유 속성 키로 사용하여 다른 코드가 해당 객체에 추가할 수 있는 키와 충돌합니다.

const mySymbol = Symbol( "Desc" );

const myObject = {

}

myObject
> Object { Symbol("Desc"): "propSymbol" }

기호에는 세 가지 유형이 있습니다.

  • Symbol()(으)로 만든 기호
  • 다음을 사용하여 전역 기호 레지스트리에서 설정 및 검색되는 공유 기호 Symbol.for()
  • '잘 알려진 상징물' Symbol 객체에서 정적 속성으로 정의됩니다. 이 기호에는 실수로 덮어쓸 수 없는 내부 메서드가 포함되어 있습니다.

Symbol()는 설명 (또는 '기호 이름')을 선택적 인수로 허용합니다. 이러한 설명은 디버깅 목적으로 사람이 읽을 수 있는 라벨이며 결과의 고유성에 영향을 주지 않습니다. Symbol를 호출하면 완전히 고유한 기호 프리미티브(여러 호출이 동일한 경우라도) 설명:

Symbol( "My symbol." ) === Symbol( "My symbol." );
> false

다른 프리미티브 데이터 유형과 마찬가지로 기호는 프로토타입 예를 들어 생성된 기호의 상속된 속성으로 설명에 액세스할 수 있습니다.

let mySymbol = Symbol( "My symbol." );

mySymbol
.description
> "My symbol."

그러나 new 키워드를 사용하여 기호를 만들 수는 없습니다.

let mySymbol = new Symbol();

> Uncaught TypeError: Symbol is not a constructor

기호는 열거 가능하지 않습니다. 즉, 기호화된 속성을 사용할 수 없습니다. 이는 표준 메서드를 사용하여 반복할 때 발생합니다. getOwnPropertySymbols() 메서드는 객체의 기호 속성에 대한 액세스 권한을 부여합니다.

공유 기호

Symbol.for() 메서드는 지정된 문자열을 키로 사용하는 런타임 범위의 전역 기호 레지스트리를 포함하고 일치하는 기호를 찾습니다. 값을 찾지 못하면 기호를 생성합니다. 를 호출하여 전역 레지스트리에 추가합니다.

let sharedSymbol = Symbol.for( "My key." );

sharedSymbol
=== Symbol.for( "My key." )
> true

이 키는 다음에 할당된 설명과 기능적으로 겹치지 않습니다. 작성자가 만든 Symbol 프리미티브 기호 레지스트리의 기호에 액세스하려면 먼저 for()를 사용하여 만들어야 합니다.

Symbol( "String" ) === Symbol( "String" );
> false

Symbol( "String" ) === Symbol().for( "String" );
> false

Symbol().for( "String" ) === Symbol().for( "String" );
> true

기호 레지스트리에서 기호에 대한 키를 검색하려면 다음을 사용합니다. Symbol.keyFor():

let mySymbol = Symbol.for( "Key." );

Symbol.keyFor( mySymbol ) ;
> "Key."

'잘 알려짐' 기호

잘 알려진 기호는 각각 Symbol 객체의 정적 속성입니다. 기호 자체입니다. 잘 알려진 기호는 자바스크립트의 내장 메서드에 액세스하고 이를 수정하는 동시에 동작을 덮어쓰지 않도록 합니다.

Symbol;
> function Symbol()
    asyncIterator
: Symbol(Symbol.asyncIterator)
   
for: function for()
    hasInstance
: Symbol("Symbol.hasInstance")
    isConcatSpreadable
: Symbol("Symbol.isConcatSpreadable")
    iterator
: Symbol(Symbol.iterator)
    keyFor
: function keyFor()
    length
: 0
    match
: Symbol("Symbol.match")
    matchAll
: Symbol("Symbol.matchAll")
    name
: "Symbol"
    prototype
: Object { }
    replace
: Symbol("Symbol.replace")
    search
: Symbol("Symbol.search")
    species
: Symbol("Symbol.species")
    split
: Symbol("Symbol.split")
    toPrimitive
: Symbol("Symbol.toPrimitive")
    toStringTag
: Symbol("Symbol.toStringTag")
    unscopables
: Symbol("Symbol.unscopables")
   
<prototype>: function ()

기호는 ES6에만 있는 기능이기 때문에, 이러한 기호 값은 '확장 지점'으로 사용됩니다. 자바스크립트 코드의 수정 방법을 이전 버전과의 호환성 문제를 일으키지 않고 동작을 개선할 수 있습니다.

잘 알려진 기호 값은 종종 @@ 접두사 또는 %로 래핑 키를 변경 가능한 프로토타입에서 구별할 수 있어야 합니다. 예: @@match (또는 %match%)는 변경 불가능한 Symbol.match 참조이며 String.prototype.match입니다.

이해도 확인

new를 사용하여 기호를 만들 수 있나요?

아니요

다음 중 '잘 알려진' 기호에 대한 설명은 무엇인가요?

자주 사용하는 기호
`Symbol` 객체의 정적 속성
JavaScript에 액세스하고 수정하기 위한 고유 속성 키 기본 제공 메서드