기호는 상대적으로 새로운 프리미티브입니다. 기호 프리미티브는 다른 기호 프리미티브의 값을 포함하여 다른 어떤 값과도 충돌하지 않습니다. 동일한 문자로 구성된 두 개의 문자열 프리미티브는 엄격하게 같음:
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
를 사용하여 기호를 만들 수 있나요?
다음 중 '잘 알려진' 기호에 대한 설명은 무엇인가요?