programing

ES6에 심볼을 도입하는 동기는 무엇입니까?

sourcetip 2023. 1. 30. 22:37
반응형

ES6에 심볼을 도입하는 동기는 무엇입니까?

업데이트: 최근에 Mozilla에서 훌륭한 기사가 나왔습니다.궁금하면 읽어보세요.

아시다시피 ECMAScript 6에 새로운 심볼 프리미티브 타입을 포함시킬 예정입니다(다른 이상한 것은 말할 것도 없습니다).난 항상 생각했지:symbol이치노대신 자바스크립트처럼 플레인 스트링을 쉽게 사용할 수 있습니다.그리고 이제 JS의 문제를 복잡하게 만들기로 결정했습니다.

나는 그 동기를 이해할 수 없다.JavaScript에 정말 심볼이 필요한지 설명해 주실 수 있나요?

Javascript에 기호를 도입한 최초의 동기는 사유재산을 활성화하기 위한 것이었다.

불행하게도, 그들은 결국 심하게 강등되었다. 수 있기 사적이 .Object.getOwnPropertySymbols또는 프록시를 사용합니다.

현재는 고유 기호로 알려져 있으며 속성 간의 이름 충돌을 방지하기 위한 용도로만 사용됩니다.예를 들어 ECMAScript 자체는 사용자 이름과 충돌할 위험 없이 개체에 추가할 수 있는 특정 메서드를 통해 확장 후크를 도입할 수 있습니다(예를 들어 반복 프로토콜을 정의함).

그것이 언어에 기호를 추가할 만큼 충분한 동기가 되는지는 논란의 여지가 있다.

기호는 진정한 프라이버시를 보장하지는 않지만 객체의 공용 속성과 내부 속성을 구분하는 데 사용할 수 있습니다. 예를 들어 .Symbol사유지를 가지고 있다는 이유로요

개체의 속성이 비공개가 아닌 예를 들어 보겠습니다.

var Pet = (function() {
  function Pet(type) {
    this.type = type;
  }
  Pet.prototype.getType = function() {
    return this.type;
  }
  return Pet;
}());

var a = new Pet('dog');
console.log(a.getType());//Output: dog
a.type = null;
//Modified outside
console.log(a.getType());//Output: null

「」는,Pet property ' 속성'type을 사용하다다음 는 을 만드는 방법을 줍니다.type이치노

var Pet = (function() {
  function Pet(type) {
    this.getType = function(){
      return type;
    };
  }
  return Pet;
}());

var b = new Pet('dog');
console.log(b.getType());//dog
b.type = null;
//Stays private
console.log(b.getType());//dog

위의 접근법의 단점:각각에 대해 추가 폐쇄를 도입하고 있습니다.Pet 수 .

이번에는 now소소소 now now now소소다 now를 소개하겠습니다.Symbol이렇게 하면 불필요한 폐쇄를 사용하지 않고도 사유지를 비공개로 만들 수 있습니다.「 」 「 」 。

var Pet = (function() {
  var typeSymbol = Symbol('type');
  function Pet(type) {
    this[typeSymbol] = type;
  }
  Pet.prototype.getType = function(){
    return this[typeSymbol];
  }
  return Pet;
}());

var a = new Pet('dog');
console.log(a.getType());//Output: dog
a.type = null;
//Stays private
console.log(a.getType());//Output: dog

기호는 객체의 고유한 속성 이름으로 사용할 수 있는 새로운 종류의 객체입니다.문자열 대신 기호를 사용하면 서로 충돌하지 않는 속성을 서로 다른 모듈에서 만들 수 있습니다.또한 기호를 효과적으로 비공개로 만들 수 있기 때문에 아직 기호를 직접 액세스하지 않은 사람이 해당 속성에 액세스할 수 없습니다.

심볼은 숫자, 문자열 및 부울 프리미티브와 마찬가지로 새로운 프리미티브입니다.다른 기본 원소와 달리, 기호에는 문자 그대로의 구문이 없습니다(예: 방법).string 있다''를하는 " " " " " " " " " " " " 。Symbol컨스트럭터에는 다음과 같은 방법이 있습니다.

let symbol = Symbol();

을 붙이는 인데, 잘 방법으로 할 수 .잘 알려진 심볼을 표준적인 방법으로 쉽게 제공할 수 있습니다.Object.prototype.hasOwnProperty 것을 Object.

여기에서는, 다음의 몇개의 메리트를 소개합니다.Symbol원시형

기호에는 디버깅 기능이 내장되어 있습니다.

기호에 대한 설명을 지정할 수 있습니다.기호는 콘솔에 기록할 때 생활을 좀 더 쉽게 하기 위해 디버깅에만 사용됩니다.

기호를 객체 키로 사용할 수 있습니다.

여기서 심볼이 정말 흥미로워집니다.그것들은 물건들로 심하게 얽혀 있다.기호를 객체에 키로 할당할 수 있습니다. 즉, 개체에 무제한의 고유 기호를 할당할 수 있으며 문자열 키 또는 다른 고유 기호와 충돌하지 않도록 보장할 수 있습니다.

기호를 고유한 값으로 사용할 수 있습니다.

이 여러 개 가정해 .이 라이브러리에는 다음과 같은 여러 로그 레벨이 포함됩니다.logger.levels.DEBUG,logger.levels.INFO,logger.levels.WARN 코드에서는 싶은 문자열입니다.logger.levels.DEBUG === 'debug' 숫자숫자)logger.levels.DEBUG === 10두 값 모두 고유한 값이 아니기 때문에 이상적인 값은 아니지만 기호입니다. ★★★★★★★★★★★★★★★★★.logger.levels다음과 같이 됩니다.

log.levels = {
  DEBUG: Symbol('debug'),
  INFO: Symbol('info'),
  WARN: Symbol('warn'),
};
log(log.levels.DEBUG, 'debug message');
log(log.levels.INFO, 'info message');

자세한 내용은 이 훌륭한 기사를 참조하십시오.

은 ★★★에 입니다.Symbol()찾을 수 있는 실제 예시와 찾을 수 있는 사실과 정의를 제공합니다.

TLDR;

Symbol() 6의 타입입니다.ECMAScript 6(ES6)은 데이터 타입입니다.

심볼에 대한 두 가지 흥미로운 사실이 있습니다.

  • 자바스크립트에서 리터럴이 없는 최초의 데이터 타입이자 유일한 데이터 타입

  • variable(임의의 , 「」로 정의)Symbol()는 독자적인 컨텐츠를 취득하고 있습니다만, 실제로는 비공개인 것은 아닙니다.

  • 모든 데이터에는 자체 기호가 있으며, 동일한 데이터의 경우 기호는 동일합니다.다음 단락의 자세한 내용은 TLRD가 아닙니다.그렇지 않으면 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)는, 방법으로도 사용할 수 없습니다를 참조해 주세요.

다음 두 단락에는 첫 번째 유형 기호만 포함됩니다.

이전 데이터 유형 대신 기호를 사용하면 어떤 이점이 있습니까?

먼저 표준 데이터 유형인 개체를 살펴보겠습니다.여기서 키와 값의 쌍을 정의하고 키를 지정하여 값에 액세스할 수 있습니다.

var persons = {"peter":"pan","jon":"doe"};
console.log(persons.peter);
// pan

피터라는 이름을 가진 두 사람이 있다면?

이 조작:

var persons = {"peter":"first", "peter":"pan"};

별로 말이 되지 않을 겁니다

자,그러면새로운것을참조해볼까요?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"};


대상을 , 목, 목, 목, 주, 주, 주, ifying, ifying, ifying, ifying, ifying, ifying, ifying, ifying, ifying, ifying, ifying, ifying, ifying, ifying, ifying, ifying, ifying, ifying, ifying, ifying, ifying, ifying, ifying,JSON.stringify기호 키를 사용하여 초기화된 모든 쌍을 삭제합니다.
" " "의 실행Object.keys 도 그런 돌려주지 않는다Symbol()->valuepairs.pairs.pairs.

이 초기화를 사용하면 엔트리를 1인칭과 2인칭으로 착각할 수 없습니다. " "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

또한 이전 단락에서와 같이 기호로 정의된 경우:

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
    

제 견해는 이렇습니다.심볼은 오브젝트의 키/속성이 Object.keys() 및 JSON.stringify()와 같은 일반적인 메서드를 통해 노출되는 것을 방지함으로써 '추가 수준의 프라이버시'를 제공합니다.

var age = Symbol();  // declared in another module perhaps?
class Person {
   constructor(n,a){
      this.name = n;
      this[age] = a;  
   }
   introduce(){
       console.log(`My name is ${this.name}. I am ${this[age]-10}.`);
   }
}
var j = new Person('Jane',45);
j.introduce();  // My name is Jane. I am 35.
console.log(JSON.stringify(j)); // {"name":"Jane"}
console.log(Object.keys(j)); // ["name"]
console.log(j[age]); // 45   (well…only if you know the age in the first place…)

오브젝트 자체는 지정되지만 이러한 속성은 reflection, proxy, Object.getOwnPropertySymbols() 등을 통해 노출될 수 있지만 몇 가지 직접 메서드를 통해 액세스할 수 있는 자연스러운 방법은 없습니다.이러한 방법은 OOP 관점에서 충분할 수 있습니다.

JS 기호는 새로운 기본 데이터 유형입니다.이들은 하나의 ID로 기능하는 토큰입니다.기호를 생성할 수 있습니다.Symbol MDNMDN로 들 수 있습니다.

// The symbol constructor takes one optional argument, 
// the descriptions which is used for debugging only.
// Here are two symbols with the same description
let Sym1 = Symbol("Sym");
let Sym2 = Symbol("Sym");
  
console.log(Sym1 == Sym2); // returns "false"
// Symbols are guaranteed to be unique.
// Even if we create many symbols with the same description,
// they are different values.

기호를 고유한 개체 속성 키로 사용하면 다음과 같이 편리합니다.

let obj = {};
let prop = Symbol();

obj[prop] = 123;  // the symbol prop is assigned 123
obj.prop  = 456;  // the string prop is assigned 456

console.log(obj.prop, obj[prop]); // logs 456, 123

기호에는 두 가지 주요 사용 사례가 있습니다.

  1. '아예'입니다.속성을 다른 스크립트나 라이브러리에 "속"하는 개체에 추가하려면 기호를 생성하여 속성 키로 사용할 수 있습니다. 않습니다.for..in다른 자산과 함께 잘못 처리되지 않도록 합니다.또한 다른 스크립트에는 우리의 기호가 없기 때문에 직접 액세스할 수 없습니다.따라서 실수로 사용하거나 덮어쓰지 않도록 속성을 보호할 수 있습니다.

    그래서 우리는 심볼 속성을 사용하여 우리가 필요로 하지만 다른 사람들은 보지 말아야 할 물건에 무언가를 "커버트로" 숨길 수 있습니다.

  2. 는 JavaScript로 액세스할 수 .Symbol.*내장 동작을 변경할 수 있습니다.★★★★★★★★★★★★★★★★★* Symbol.iterator 가능한 경우, " " "Symbol.toPrimitive오브젝트 대 오브젝트 변환 설정 등입니다.

원천

언급URL : https://stackoverflow.com/questions/21724326/what-is-the-motivation-for-bringing-symbols-to-es6

반응형