이 게시물은 Symbol()
내가 찾거나 만들 수있는 실제 예제와 내가 찾을 수있는 사실 및 정의와 함께 제공됩니다.
TLDR;
는 Symbol()
ECMAScript를 6 (ES6)의 방출 도입 데이터 형식이다.
Symbol에 대한 두 가지 흥미로운 사실이 있습니다.
리터럴이없는 JavaScript의 첫 번째 데이터 유형 및 유일한 데이터 유형
로 정의 된 모든 변수 Symbol()
는 고유 한 콘텐츠를 얻지 만 실제로는 비공개 가 아닙니다 .
모든 데이터에는 자체 Symbol 이 있으며 동일한 데이터에 대해 Symbols는 동일 합니다. 다음 단락에서 더 많은 정보, 그렇지 않으면 TLRD가 아닙니다. :)
심볼을 어떻게 초기화합니까?
1. 디버깅 가능한 값을 가진 고유 식별자를 얻으려면
이 방법으로 할 수 있습니다 :
var mySymbol1 = Symbol();
또는이 방법 :
var mySymbol2 = Symbol("some text here");
"some text here"
문자열이 기호에서 추출 할 수 없습니다, 그것은 디버깅 목적으로 만 설명입니다. 어떤 식 으로든 기호 동작을 변경하지 않습니다. 비록 당신이 할 수는 console.log
있지만 (값은 디버깅을위한 것이므로 다른 로그 항목으로 그 로그를 착각하지 않도록)
console.log(mySymbol2);
// Symbol(some text here)
2. 일부 문자열 데이터에 대한 기호를 얻으려면
이 경우 심볼의 값이 실제로 고려되며이 방식으로 두 심볼이 고유하지 않을 수 있습니다.
var a1 = Symbol.for("test");
var a2 = Symbol.for("test");
console.log(a1 == a2); //true!
이러한 기호를 "두 번째 유형"기호라고합니다. Symbol(data)
어떤 식 으로든 "첫 번째 유형"기호 (예 :로 정의 된 기호)와 교차하지 않습니다 .
다음 두 단락은 첫 번째 유형 기호 에만 해당 됩니다.
이전 데이터 유형 대신 Symbol을 사용하면 어떤 이점이 있습니까?
먼저 표준 데이터 유형 인 객체를 고려해 봅시다. 키-값 쌍을 정의하고 키를 지정하여 값에 액세스 할 수 있습니다.
var persons = {"peter":"pan","jon":"doe"};
console.log(persons.peter);
// pan
Peter라는 이름을 가진 두 사람이 있다면 어떨까요?
이것을하는 것 :
var persons = {"peter":"first", "peter":"pan"};
별로 이해가되지 않습니다.
따라서 같은 이름을 가진 두 명의 완전히 다른 사람의 문제인 것 같습니다. 그런 다음 new를 참조하십시오 Symbol()
. 실생활의 사람 과 같습니다. 모든 사람은 독특 하지만 이름은 동일 할 수 있습니다. 두 "사람"을 정의합시다.
var a = Symbol("peter");
var b = Symbol("peter");
이제 같은 이름을 가진 두 사람이 있습니다. 우리의 사람들은 실제로 다른가? 그들은; 당신은 이것을 확인할 수 있습니다 :
console.log(a == b);
// false
우리는 어떻게 유익합니까?
우리는 다른 사람을 위해 당신의 물건에 두 개의 항목을 만들 수 있으며 어떤 식 으로든 착각 할 수 없습니다.
var firstPerson = Symbol("peter");
var secondPerson = Symbol("peter");
var persons = {[firstPerson]:"first", [secondPerson]:"pan"};
참고 :
객체를 문자열 화하면 JSON.stringify
Symbol로 키로 초기화 된 모든 쌍이 삭제됩니다.
실행 Object.keys
은 그러한 Symbol()->value
쌍을 반환하지 않습니다 .
이 초기화를 사용하면 첫 번째 사람과 두 번째 사람의 항목을 착각하는 것은 절대 불가능합니다. 전화 console.log
하면 두 번째 이름이 올바르게 출력됩니다.
console.log(persons[a]);
// first
console.log(persons[b]);
// pan
객체에 사용될 때 열거 불가능한 속성을 정의하는 것과 어떻게 다른가요?
실제로, 숨겨 Object.keys
지고 열거 될 속성을 정의하는 방법이 이미 존재했습니다 . 여기있어:
var anObject = {};
var fruit = "apple";
Object.defineProperty( anObject, fruit, {
enumerable: false,
value: "green"
});
어떤 차이가 Symbol()
있습니까? 차이점은 Object.defineProperty
일반적인 방법으로 속성을 정의 할 수 있다는 것입니다.
console.log(anObject[fruit]); //green
console.log(anObject["apple"]); //green
console.log(anObject.apple); //green
그리고 이전 단락에서와 같이 Symbol로 정의 된 경우 :
fruit = Symbol("apple");
변수를 알고있는 경우에만 값을받을 수 있습니다.
console.log(anObject[fruit]); //green
console.log(anObject["apple"]); //undefined
console.log(anObject.apple); //undefined
또한 키 아래에 다른 속성을 정의 "apple"
하면 개체가 오래된 개체를 삭제하게됩니다 (하드 코딩 된 경우 오류가 발생할 수 있음). 더 이상 사과는 없습니다! 그 유감. 이전 단락을 참조하면 기호는 고유하며 Symbol()
고유하게 키를 정의합니다 .
타입 변환 및 확인
다른 데이터 형식과 달리 Symbol()
합니다.
호출하여 원시 데이터 유형을 기반으로 심볼을 "만들"수 있습니다 Symbol(data)
.
유형 확인 측면에서 아무 것도 변경되지 않습니다.
function isSymbol ( variable ) {
return typeof someSymbol === "symbol";
}
var a_Symbol = Symbol("hey!");
var totally_Not_A_Symbol = "hey";
console.log(isSymbol(a_Symbol)); //true
console.log(isSymbol(totally_Not_A_Symbol)); //false