ES6 학습 노트 (8) 기호

8313 단어
1. 개술
  • ES6 는 새로운 원시 데이터 형식 Symbol 을 도입 하여 유일무이한 값 을 나타 낸다.이것 은 자 바스 크 립 트 언어의 일곱 번 째 데이터 형식 으로
  • 입 니 다.
  • Symbol 함 수 는 하나의 문자열 을 매개 변수 로 받 아들 여 Symbol 인 스 턴 스 에 대한 설명 을 표시 할 수 있 습 니 다. 주로 콘 솔 에 표시 하거나 문자열 로 전환 할 때 쉽게 구분 할 수 있 습 니 다.
  •   let s1 = Symbol('foo')
      let s2= Symbol('bar')
      s1  // Symbol(foo)
      s2 // Symbol(bar)
      s1.toString()  // 'Symbol(foo)'
      s2.toString()  // 'Symbol(bar)'
    
  • Symbol 매개 변수 가 대상 이 라면 이 대상 의 toString 방법 을 호출 합 니 다. 문자열 로 전환 한 다음 Symbol 값
  • 을 생 성 합 니 다.
  • Symbol 함수 의 매개 변 수 는 현재 Symbol 이 설명 할 만 한 가치 가 있 음 을 나타 내기 때문에 같은 매개 변수의 Symbol 함수 의 반환 값 은 같 지 않 은
  • 이다.
      //        
      let s1 = Symbol();
      let s2 = Symbol();
      s1 === s2 // false
      //       
      let s1 = Symbol('foo');
      let s2 = Symbol('foo');
      s1 === s2 // false
    

    Symbol 값 은 다른 유형의 값 과 연산 할 수 없습니다. 오류 가 발생 할 수 있 습 니 다.
      let sym = Symbol('My symbol');
      "your symbol is " + sym
      // TypeError: can't convert symbol to string
      `your symbol is ${sym}`
      // TypeError: can't convert symbol to string
    
  • Symbol 값 은 문자열 로 표시 할 수 있 습 니 다.불 값 으로 도 바 꿀 수 있 지만 수치 로 바 꿀 수 는 없다.
  •   let sym = Symbol('My symbol');
      String(sym) // 'Symbol(My symbol)'
      sym.toString() // 'Symbol(My symbol)'
      Boolean(sym) // true
      !sym  // false
      if (sym) {
        // ...
      }
      Number(sym) // TypeError
      sym + 2 // TypeError
    

    2. 속성 명 Symbol
    모든 Symbol 값 이 같 지 않 기 때문에 Symbol 값 은 식별 자로 사용 할 수 있 고 대상 의 속성 명 에 사용 하면 같은 이름 의 속성 이 나타 나 지 않 음 을 보증 할 수 있 습 니 다.이것 은 한 대상 이 여러 모듈 로 구 성 된 상황 에 매우 유용 하 며, 어떤 키 가 부주의 로 고 쳐 쓰 거나 덮어 쓰 는 것 을 방지 할 수 있다.
      let mySymbol = Symbol();
      //      
      let a = {};
      a[mySymbol] = 'Hello!';
      //      
      let a = {
        [mySymbol]: 'Hello!'
      };
      //      
      let a = {};
      Object.defineProperty(a, mySymbol, { value: 'Hello!' });
      //            
      a[mySymbol] // "Hello!"
      //       ,   Symbol       ,Symbol           。
      // Symbol        ,         ,      。
    

    3. 인 스 턴 스: 마술 문자열 제거
    마술 문자열 은 코드 에 여러 번 나타 나 코드 와 강 한 결합 을 이 루 는 구체 적 인 문자열 이나 수 치 를 말한다.스타일 이 좋 은 코드 는 마술 문자열 을 최대한 없 애고 의미 가 뚜렷 한 변수 로 대체 해 야 합 니 다.
      const shapeType = {
        triangle: Symbol()
      };  //      getArea   Triangle
      
     function getArea(shape, options) {
      let area = 0;
      switch (shape) {
        case 'Triangle': //      
          area = .5 * options.width * options.height;
          break;
        /* ... more code ... */
      }
      return area;
    }
    getArea('Triangle', { width: 100, height: 100 }); //      
    

    4. 속성 명 옮 겨 다 니 기
    Symbol 은 속성 명 으로서 이 속성 은 for...in, for...of 순환 에 나타 나 지 않 고 Object.keys(), Object.getOwnPropertyNames(), JSON.stringify() 에 돌아 오지 않 습 니 다.그러나 이것 은 사유 속성 도 아니 고 Object.getOwnPropertySymbols 방법 이 있어 지 정 된 대상 의 모든 Symbol 속성 명 을 얻 을 수 있다.Object.getOwnPropertySymbols 방법 은 하나의 배열 을 되 돌려 줍 니 다. 구성원 은 현재 대상 의 모든 속성 명 으로 사용 되 는 Symbol 값 입 니 다.
    const obj = {};
    let a = Symbol('a');
    let b = Symbol('b');
    
    obj[a] = 'Hello';
    obj[b] = 'World';
    
    const objectSymbols = Object.getOwnPropertySymbols(obj);
    
    objectSymbols
    // [Symbol(a), Symbol(b)]
    
    Reflect.ownKeys 방법 은 일반적인 키 이름과 Symbol 키 를 포함 하여 모든 종류의 키 이름 을 되 돌려 줄 수 있 습 니 다.배열 로 돌아 가 비 개인 적 인 내부 방법의 효 과 를 가 져 왔 다.
    let size = Symbol('size');
    
    class Collection {
      constructor() {
        this[size] = 0;
      }
    
      add(item) {
        this[this[size]] = item;
        this[size]++;
      }
    
      static sizeOf(instance) {
        return instance[size];
      }
    }
    
    let x = new Collection();
    Collection.sizeOf(x) // 0
    
    x.add('foo');
    Collection.sizeOf(x) // 1
    
    Object.keys(x) // ['0']
    Object.getOwnPropertyNames(x) // ['0']
    Object.getOwnPropertySymbols(x) // [Symbol(size)]
    

    5. Symbol.for(),Symbol.keyFor()
    우 리 는 같은 Symbol 값 을 다시 사용 하고 Symbol.for 방법 으로 이 점 을 할 수 있 기 를 바 랍 니 다.문자열 을 매개 변수 로 받 아들 인 다음 이 매개 변 수 를 이름 으로 하 는 Symbol 값 이 있 는 지 검색 합 니 다.있 으 면 이 Symbol 값 을 되 돌려 줍 니 다. 그렇지 않 으 면 이 문자열 이름 의 Symbol 값 을 새로 만 들 고 되 돌려 줍 니 다.
      let s1 = Symbol.for('foo');
      let s2 = Symbol.for('foo');
    
      s1 === s2 // true
    
  • Symbol.for()Symbol() 이라는 두 가지 표기 법 은 모두 새로운 Symbol 을 생 성 할 것 이다.예 를 들 어 Symbol.for("cat") 30 번 을 호출 하면 매번 같은 Symbol 값 을 되 돌려 주지 만 Symbol("cat")30 번 을 호출 하면 30 개의 다른 Symbol 값 을 되 돌려 줍 니 다.Symbol.keyFor 방법 은 등 록 된 Symbol 형식 값 의 key 을 되 돌려 줍 니 다.

  • 7. 내 장 된 Symbol 값
  • Symbol.hasInstance 대상 의 Symbol.hasInstance 속성 은 하나의 내부 방법 을 가리킨다.다른 대상 이 instanceof 연산 자 를 사용 하여 이 대상 의 인 스 턴 스 여 부 를 판단 할 때 이 방법 을 사용 합 니 다.예 를 들 어 foo instanceof Foo 은 언어 내부 에서 실제 호출 된 것 은 Foo[Symbol.hasInstance](foo) 이다.
  • item.recentVacancyCount 대상 의 Symbol.isConcatSpreadable 속성 은 하나의 불 값 과 같 으 며, 이 대상 이 Array.prototype.concat() 에 사용 되 었 을 때
  • 을 펼 칠 수 있 는 지 여 부 를 나타 낸다.
  • Symbol.species 대상 의 Symbol.species 속성 은 구조 함 수 를 가리킨다.파생 대상 을 만 들 때 이 속성 을 사용 합 니 다.
  • Symbol.match 대상 의 Symbol.match 속성 은 하나의 함 수 를 가리킨다.str.match(myObject) 을 실행 할 때 이 속성 이 존재 하면 호출 하여 이 방법의 반환 값 을 되 돌려 줍 니 다.
  • Symbol.replace 대상 의 Symbol.replace 속성 은 하나의 방법 을 가리 키 며, 이 대상 이 String.prototype.replace 방법 으로 호출 되면 이 방법의 반환 값 을 되 돌려 줍 니 다.
  • Symbol.search 대상 의 Symbol.search 속성 은 하나의 방법 을 가리 키 며, 이 대상 이 String.prototype.search 방법 으로 호출 되면 이 방법의 반환 값 을 되 돌려 줍 니 다.
  • Symbol.split 대상 의 Symbol.split 속성 은 하나의 방법 을 가리 키 며, 이 대상 이 String.prototype.split 방법 으로 호출 되면 이 방법의 반환 값 을 되 돌려 줍 니 다.
  • Symbol.iterator 대상 의 Symbol.iterator 속성 으로 이 대상 을 가리 키 는 기본 달력 방법 입 니 다.
  • Symbol.toPrimitive 대상 의 Symbol.toPrimitive 속성 은 하나의 방법 을 가리킨다.이 대상 이 원본 형식의 값 으로 바 뀌 었 을 때 이 방법 을 사용 하여 해당 대상 에 대응 하 는 원본 형식 값 을 되 돌려 줍 니 다.
  • Symbol.toStringTag 대상 의 Symbol.toStringTag 속성 은 하나의 방법 을 가리킨다.이 대상 에서 Object.prototype.toString 방법 을 호출 할 때 이 속성 이 존재 하면 반환 값 은 toString 방법 으로 되 돌아 오 는 문자열 에 나타 나 대상 의 유형 을 표시 합 니 다.즉, 이 속성 은 [object Object] 또는 [object Array] 의 object 뒤의 문자열 을 맞 출 수 있 습 니 다.ES6 에 새로 추 가 된 내장 대상 의 속성 치 는 다음 과 같다.Symbol.toStringTag: 'JSON' JSON[Symbol.toStringTag]: 'Math' Math[Symbol.toStringTag]: 'Module' Module M[Symbol.toStringTag]: 'Array Buffer' ArrayBuffer.prototype[Symbol.toStringTag]: 'DataView' DataView.prototype[Symbol.toStringTag]: 'Map' Map.prototype[Symbol.toStringTag]: 'Promise' Promise.prototype[Symbol.toStringTag]: 'Set' Set.prototype[Symbol.toStringTag]: 'Uint8Array' 등 %TypedArray%.prototype[Symbol.toStringTag]: 'WeakMap' WeakMap.prototype[Symbol.toStringTag]: 'WeakSet' WeakSet.prototype[Symbol.toStringTag]: 'Map Iterator' %MapIteratorPrototype%[Symbol.toStringTag]: 'Set Iterator' %SetIteratorPrototype%[Symbol.toStringTag]: 'Set Iterator' %StringIteratorPrototype%[Symbol.toStringTag] :'String Iterator' Symbol.prototype[Symbol.toStringTag] :'Symbol' Generator.prototype[Symbol.toStringTag] :'Generator' GeneratorFunction.prototype[Symbol.toStringTag] :'GeneratorFunction'
  • Symbol.unscopables 대상 의 Symbol.unscopables 속성 으로 한 대상 을 가리킨다.이 대상 은 with 키 워드 를 사용 할 때 어떤 속성 이 with 환경 에서 제 외 될 지 지정 합 니 다.
  • 좋은 웹페이지 즐겨찾기