Symbol
유형은 JavaScript
의 특수 유형입니다. 특히 모든 Symbol
유형 값은 서로 다릅니다. "Symbol"을 사용하여 고유한 값을 나타낼 수 있습니다. 다음은 Symbol
객체를 생성하는 예입니다.
let id = Symbol();
이러한 방식으로 Symbol
유형 값을 생성하고 이 값을 변수 id
에 저장합니다.
Symbol
유형 변수를 생성할 때 이 변수의 목적 정보를 설명하기 위해 매개변수에 초 속성이 있는 일부 문자열을 전달할 수 있습니다.
예를 들어,
let id1 = Symbol('미치고 멋진 샤오밍의 id'); let id2 = Symbol('소박하고 고급스럽고 암시적인 Tingting의 id');
Symbol
유형은 언제든지 다릅니다. 동일한 설명 정보가 있더라도 설명은 레이블일 뿐이며 다른 목적은 없습니다. 예:
let id1 = 기호('id'); let id2 = Symbol('id'); console.log(id1==id2);//
false label의 의미는 Symbol
내부의 특정 값을 직관적으로 볼 수 없는 것과 관련이 있다고 개인적으로 생각합니다. 설명 정보를 추가하면 좀 더 직관적일 수 있습니다. 변수의 사용에 대한 이해.
JavaScript
의 대부분의 유형은 출력을 위해 문자열 유형으로 직접 변환될 수 있으므로 해당 값이 무엇인지 직관적으로 확인할 수 없습니다. 예를 들어 숫자 alert(123)
123
직접 변환할 수 있습니다. 문자열 팝업으로 변환합니다.
그러나 Symbol
유형은 특별하며 직접 변환할 수 없습니다. 예:
let id = Symbol(); 경고(id);//오류 보고서, 기호 유형은
Symbol
로 변환할 수 없습니다. JavaScript
의 Symbol
유형은 언어 혼동을 방지하기 위한 고유한 "언어 보호" 메커니즘으로 인해 문자열로 변환할 수 없습니다. 본질적으로 다름 차이가 있으며 하나를 다른 것으로 변환해서는 안 됩니다.
Symbol
문자열로 변환할 수 있다면 고유한 문자열을 생성하는 함수가 되며 독립적인 데이터 유형이 필요하지 않다고 상상해 보세요.
정말로 Symbol
변수의 값을 알고 싶다면 다음과 같이 .toString()
메소드를 사용할 수 있습니다:
let id = Symbol('this is recognition'); console.log(id.toString());//Symbol(식별입니다);
또는 설명 정보를 얻으려면 .description
속성을 사용하십시오:
let id = Symbol('어서, Oli를 주세요'); console.log(id.description);//어서, Ollie”
따르면
JavaScript
가지 유형의 값만 객체 속성 키로 사용할 수
다른 유형이 사용되면 암시적으로 문자열 유형으로 변환됩니다. 객체의 키는 이전 장에서 자세히 소개되었으며 여기서는 반복하지 않습니다.
Symbol
두 가지가 있습니다
예 1:
let id = Symbol('id'); 사용자 = {}로 두십시오; user[id] = 'id value';//기호 키 추가 console.log(user[id]);//id value
예 2:
let id = Symbol('id'); 사용자 = { [id]:'id value',//여기서 대괄호에 유의하세요. }; console.log(user[id]);
위의 두 경우는 Symbol
유형을 객체에 키로 삽입하는 방법을 보여줍니다. 속성에 액세스할 때는 obj.id
대신 obj[id]
사용해야 한다는 점에 유의해야 합니다. obj.id
, obj.id
obj['id']
나타내기 때문입니다.
Symbol
객체의 키로 사용하면 어떻게 될까요?
Symbol
의 매우 분명한 특징은 객체가 Symbol
키로 사용하는 경우 for…in
문을 사용하여 Symbol
유형 속성에 액세스할 수 없다는 것입니다.
예를 들면:
id = Symbol('id'); 사용자 = { 이름: '샤오밍', [ID] : 'ID', }; for (let key in user) console.log(user[key]);
위의 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
> Xiaomig는
[id]
개체의 값이 인쇄되지 않음을 알 수 있습니다. 속성 목록에서 for … in
사용하면 자동으로 Symbol
유형의 키가 무시됩니다.
마찬가지로 Object.keys(user)
Symbol
유형의 모든 키를 무시합니다.
이 기능은 매우 유용한 효과를 가져올 수 있습니다. 예를 들어 우리만이 사용할 수 있는 속성을 만들 수 있습니다.
Symbol
키를 직접 얻을 수 있는 방법은 없지만 Object.assign
메소드는 모든 속성을 복사할 수 있습니다:
let id = Symbol(); obj = {라고 놔두세요 [ID] : '123' } let obj2 = Object.할당({},obj); console.log(obj2[id]);
복사된 객체가 여전히 Symbol
키를 얻을 수 없기 때문에 이는 Symbol
의 숨겨진 속성에 영향을 주지 않습니다.
Symbol
직접 문자열로 변환할 수 없기 때문에 직관적으로 그 값을 얻을 수 없으며, for … in
통해 객체의 Symbol
속성을 얻을 수도 없습니다. 즉, Symbol
변수 자체가 없으면, 객체 내부에서 해당 속성을 가져올 방법이 없습니다.
따라서 Symbol
유형의 키 값을 통해 속성을 숨길 수 있습니다. 이러한 속성은 우리 자신만 액세스할 수 있으며 다른 사람은 우리 속성을 볼 수 없습니다.
예를 들면 다음과 같습니다.
개발 과정에서 동료 "Zhang San"과 협력해야 하며 이 Zhang San은 매우 사용하기 쉬운 Tool
만들었습니다. Tool
는 무료로 Zhang San의 Tool
사용하고 싶습니다. , 이를 기반으로 고유한 속성 중 일부를 추가합니다.
Symbol
유형 키를 추가할 수 있습니다.
도구 = {//Zhang San이 작성한 도구 사용법: "무엇이든 할 수 있습니다", } let name = Symbol("내 도구 obj"); tool[name] = "이것은 내 도구입니다"; console.log(tool[name]);
위의 예는 다른 사람이 작성한 객체에 자신의 속성을 추가하는 방법을 보여줍니다. 그렇다면 일반 문자열 대신 Symbol
유형을 사용하는 이유는 무엇입니까?
그 이유는 다음과 같습니다:
tool
는 다른 사람이 작성한 코드입니다. 원칙적으로 다른 사람의 코드를 수정하면 안됩니다. 이렇게 하면Symbol
사용할 때 결코 발생하지 않습니다. Symbol
Symbol
유형 키에 접근할 수 없기 때문입니다. 즉, 다른 사람의 코드와 충돌하지 않습니다.
Symbol
유형을 사용하지 않으면 다음과 같은 상황이 발생할 가능성이 높습니다.
let tool = {//Zhang San이 작성한 도구 사용법: "무엇이든 할 수 있습니다", } tool.usage = "붐붐"; console.log(tool.usage);
위의 코드는 "usage"를 재사용하여 원래 속성을 다시 작성하므로 개체의 원래 기능이 비정상적으로 됩니다.
모든 Symbol
변수는 레이블(설명)이 동일하더라도 서로 다릅니다.
때로는 문자열 이름(레이블)을 통해 동일한 Symbol
개체에 액세스하고 싶을 때가 있습니다. 예를 들어 코드의 다른 위치에서 동일한 Symbol
에 액세스합니다.
JavaScript
전역 Symbol
레지스트리를 유지 관리합니다. 레지스트리에 Symbol
개체를 삽입하고 개체에 문자열 이름을 지정하여 개체에 액세스할 수 있습니다.
Symbol
개체를 레지스트리에 삽입하거나 읽으려면 Symbol.for(key)
메서드를 사용해야 합니다. 레지스트리에 key
라는 개체가 있으면 해당 개체가 반환되고 그렇지 않으면 새 개체가 삽입됩니다. 돌아왔다.
예:
let id1 = Symbol.for('id');//레지스트리에 id라는 이름의 기호가 없습니다. 만들고 반환합니다. let id2 = Symbol.for('id');//라는 이름의 기호가 이미 있습니다. id가 있는 Symbol의 경우 console.log(id1===id2);//true를 직접 반환합니다.
Symbol.for(key)
를 통해 Symbol
개체를 전역 변수로 사용하고 문자열을 사용할 수 있습니다. 물건의 이름을 표시해 보세요.
반대로, Symbol.keyFor(Symbol)
사용하여 객체의 이름을 역으로 가져올 수도 있습니다.
예:
let id = Symbol.for('id');//레지스트리에 id라는 기호가 없습니다. let name = Symbol.keyFor(id);를 만들고 반환합니다. console.log(name);//id
Symbol.keyFor()
함수는 전역 Symbol
개체( Symbol.for
undefined
하여 삽입된 개체)에서만 사용할 수 있습니다.
예:
let id = Symbol('id');//local Symbol let name = Symbol.keyFor(id); console.log(name);//정의되지 않은
JavaScript
에는 다음과 같은 많은 시스템 Symbol
있습니다.
Symbol.hasInstance
Symbol.iterator
Symbol.toPrimitive
이러한 고유한 변수는 나중에 점진적으로 소개됩니다.
Symbol
개체의 값은 고유합니다.Symbol
레이블을 추가하고 레이블을 통해 전역 레지스트리에 있는 개체의 엔터티를 쿼리할 수 있습니다.Symbol
for … in
Symbol
통한 전역 레지스트리 전역 Symbol
개체Symbol
완전히 숨겨지지 않습니다. Object.getOwnPropertySymbols(obj)
통해 개체의 모든 Symbol
가져오거나 Reflect.ownKeys(obj)
를 통해 개체의 모든 키를 가져올 수 있습니다. .