제10 장 기호

8248 단어
1. 개술
ES5 의 대상 속성 명 은 모두 문자열 입 니 다. 이것 은 속성 명의 충돌 을 초래 하기 쉽 습 니 다. 만약 에 하나의 메커니즘 이 있 으 면 모든 속성의 이름 이 유일무이한 것 이 어야 합 니 다. 그러면 근본적으로 속성 명의 충돌 을 방지 할 수 있 습 니 다. 이것 이 바로 ES6 가 Symbol 을 도입 한 원인 입 니 다.
ES6 는 JS 언어의 일곱 번 째 데이터 형식 인 새로운 원시 데이터 형식 Symbol 을 도 입 했 습 니 다.
Symbol 값 은 Symbol 함 수 를 통 해 생 성 됩 니 다.대상 의 속성 명 은 현재 두 가지 유형 이 있 을 수 있 으 며, 하 나 는 원래 있 던 문자열 이 고, 다른 하 나 는 새로 추 가 된 Symbol 형식 이다.속성 명 이 Symbol 유형 에 속 하 는 것 은 모두 유일무이한 것 으로 다른 속성 명 과 충돌 하지 않도록 보증 할 수 있 습 니 다.
let s = Symbol()

typeof s // 'symbol'

메모: Symbol 함수 전에 new 명령 을 사용 할 수 없습니다. 그렇지 않 으 면 오류 가 발생 할 수 있 습 니 다.생 성 된 Symbol 은 대상 이 아 닌 원본 형식의 값 이기 때문이다.심 볼 값 이 대상 이 아니 기 때문에 속성 을 추가 할 수 없다 는 것 이다.기본적으로 문자열 과 유사 한 데이터 형식 입 니 다.
Symbol 함 수 는 하나의 문자열 을 매개 변수 로 받 아들 여 Symbol 인 스 턴 스 에 대한 설명 을 표시 할 수 있 습 니 다. 주로 콘 솔 에 표시 하거나 문자열 로 전환 할 때 쉽게 구분 할 수 있 습 니 다.
let s1 = Symbol('foo');
let s2 = Symbol('bar');

s1 // Symbol(foo)
s2 // Symbol(bar)

Symbol () 의 인자 가 대상 이면 대상 의 toString () 방법 을 호출 하여 문자열 로 변환 한 다음 Symbol 값 을 생 성 합 니 다.
const obj = {
   toString() {
      return 'abc'
   }
}

const sym = Symbol(obj);
sym // Symbol(abc)

메모: 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: cant not convert symbol to string

단, symbol 값 은 문자열 로 변환 할 수 있 습 니 다.
let sym = Symbol('My symbol');

String(sym) // 'Symbol(My symbol)'

또한 Symbol 값 도 불 값 으로 바 꿀 수 있 지만 수치 로 바 꿀 수 없습니다.
let sym = Symbol();
Boolean(sym) // true
!sym // false

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 값 이 대상 속성 명 일 때 점 연산 자 를 사용 할 수 없습니다.
const mySymbol = Symbol();
const a = {};

a.mySymbol = 'Hello';
a[mySymbol] // undefined
a['mySymbol'] // 'Hello'

위의 코드 에 서 는 점 연산 자 뒤에 항상 문자열 이 있 기 때문에 my Symbol 이 표지 명 으로 가리 키 는 값 을 읽 지 않 습 니 다. 이 로 인해 a 의 속성 명 은 실제 적 으로 Symbol 값 이 아 닌 문자열 입 니 다.
Symbol 형식 은 한 그룹의 상수 도 정의 할 수 있 으 며, 이 그룹의 상수 값 이 모두 같 지 않 음 을 보증 합 니 다.
log.levels = {
   DEBUG: Symbol('debug'),
   INFO: Symbol('info'),
   WARN: Symbol('warn')
}

3. 인 스 턴 스: 마술 문자열 제거
마술 문자열 은 코드 에 여러 번 나타 나 코드 와 강 한 결합 을 이 루 는 구체 적 인 문자열 이나 수 치 를 말한다.
4. 속성 명 옮 겨 다 니 기
Symbol 은 속성 명 으로서 이 속성 은 for... in, for... of 순환 에 나타 나 지 않 고 Object. keys (), Object. getOwnProperty Names (), JSON. stringify () 에 의 해 되 돌아 오지 않 습 니 다.그러나 이것 은 개인 속성 도 아 닙 니 다. Object. getOwnProperty Symbols 방법 이 있 습 니 다. 지정 한 대상 의 모든 Symbol 속성 명 Object. getOwnProperty Symbols 방법 으로 배열 을 되 돌려 줍 니 다. 구성원 은 현재 대상 의 모든 속성 명 으로 사용 되 는 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)]

또 다른 새로운 API, Reflect. ownKeys 는 일반적인 키 이름과 Symbol 키 를 포함 한 모든 종류의 키 이름 을 되 돌려 줍 니 다.
let obj = {
  [Symbol('my_key')]: 1,
  enum: 2,
  nonEnum: 3
};

Reflect.ownKeys(obj)
//  ["enum", "nonEnum", Symbol(my_key)]

Symbol 값 을 이름 으로 하 는 속성 때문에 일반적인 방법 으로 옮 겨 다 니 지 않 습 니 다.우 리 는 이 특성 을 이용 하여 대상 에 게 비 사유 적 이 고 내부 적 인 방법 만 을 정의 할 수 있다.
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 () 는 호출 할 때마다 새로운 Symbol 형식의 값 을 되 돌려 주지 않 고 주어진 key 가 존재 하 는 지 확인 합 니 다. 존재 하지 않 으 면 새 값 을 만 듭 니 다.Symbol. for ("cat") 를 30 번 호출 하면 매번 같은 Symbol 값 을 되 돌려 주지 만 Symbol ("cat") 을 30 번 호출 하면 30 개의 다른 Symbol 값 을 되 돌려 줍 니 다.
Symbol.for('bar') === Symbol.for('bar')   // true

Symbol('bar') === Symbol('bar')  // false

Symbol. keyFor () 등 록 된 Symbol 형식 을 key 로 되 돌려 줍 니 다.
let s1 = Symbol.for('foo');
Symbol.keyFor(s1) // 'for'

let s2 = Symbol('foo');
Symbol.keyFor(s2)  // undefined

6. 인 스 턴 스, 모듈 의 Singleton 모드
Singleton 모드 는 같은 종 류 를 호출 하 는 것 을 말 합 니 다. 언제든지 같은 인 스 턴 스 로 돌아 갑 니 다.
7. 내 장 된 Symbol 값
ES6 는 자신 이 사용 하 는 Symbok 값 을 정의 하 는 것 외 에 11 개의 내 장 된 Symbol 값 을 제공 해 언어 내 부 를 가리 키 며 사용 하 는 방법 도 제공한다.
(1) Symbol.hasInstance
대상 의 Symbol. hasInstance 속성 은 내부 방법 을 가리 키 고 있 습 니 다.다른 대상 이 인 스 턴 스 of 연산 자 를 사용 하여 이 대상 의 인 스 턴 스 여 부 를 판단 할 때 이 방법 을 사용 합 니 다.예 를 들 어 foo instanceof Foo 는 언어 내부 에서 실제 적 으로 FooSymbol. hasInstance 를 호출 합 니 다.
(2) Symbol.isConcatSpreadable
대상 의 Symbol. isConcatSpreadable 속성 은 불 값 과 같 습 니 다. 이 대상 이 Array. prototype. concat () 에 사 용 될 때 펼 칠 수 있 는 지 여 부 를 표시 합 니 다.
let arr1 = ['c', 'd'];
['a', 'b'].concat(arr1, 'e') // ['a', 'b', 'c', 'd', 'e']

let arr2 = ['c', 'd'];
arr2[Symbol.isConcatSpreadable] = false;

console.log(['a', 'b'].concat(arr2, 'e')) // ['a', 'b', ['c','d'], 'e']

기본 배열 은 펼 쳐 집 니 다. arr 2 [Symbol. is ConcatSpreadable] = false 를 설정 하면 펼 쳐 지지 않 습 니 다.
대상 은 정반 대로 기본적으로 펼 치지 않 는 다.Symbol. is ConcatSpreadable] 속성 을 true 로 설정 해 야 펼 칠 수 있 습 니 다.
let obj = {length: 2, 0: 'c', 1: 'd'};
['a', 'b'].concat(obj, 'e') // ['a', 'b', obj, 'e']

obj[Symbol.isConcatSpreadable] = true;
['a', 'b'].concat(obj, 'e') // ['a', 'b', 'c', 'd', 'e']

(3) Symbol.species
대상 의 Symbol. species 속성 은 구조 함 수 를 가리 키 며 파생 대상 을 만 들 때 이 속성 을 사용 합 니 다.
(4) Symbol.match
대상 의 Symbol. match 속성 은 함 수 를 가리 키 고 있 습 니 다.str. match (my Object) 를 실행 할 때 이 속성 이 존재 하면 호출 하여 이 방법의 반환 값 을 되 돌려 줍 니 다.
(5) Symbol.replace
대상 의 Symbol. replace 속성 은 하나의 방법 을 가리 키 며, 대상 이 String. prototype. replace 방법 으로 호출 될 때 이 방법의 반환 값 을 되 돌려 줍 니 다.
(6) Symbol.search
대상 의 Symbol. search 속성 은 하나의 방법 을 가리 키 며, 대상 이 String. prototype. search 방법 으로 호출 될 때 이 방법의 반환 값 을 되 돌려 줍 니 다.
(7) Symbol.split
대상 의 Symbol. split 속성 은 하나의 방법 을 가리 키 며, 대상 이 String. prototype. split 방법 으로 호출 될 때 이 방법의 반환 값 을 되 돌려 줍 니 다.
(8) Symbol.iterator
대상 의 Symbol. iterator 속성, 이 대상 을 가리 키 는 기본 달력 방법
(9) Symbol.toPrimitive
대상 의 Symbol. toPrimitive 속성 은 하나의 방법 을 가리킨다.이 대상 이 원본 형식의 값 으로 바 뀌 었 을 때 이 방법 을 사용 하여 대상 에 대응 하 는 원본 형식 값 을 되 돌려 줍 니 다.
(10) Symbol.toStringTag
대상 의 Symbol. toStringTag 속성 은 하나의 방법 을 가리킨다.이 대상 에서 Object. prototype. toString 방법 을 호출 할 때 이 속성 이 존재 하면 반환 값 은 toString 방법 이 되 돌아 오 는 문자열 에 나타 나 대상 의 종 류 를 표시 합 니 다.즉, 이 속성 은 [object Object] 나 [object Array] 의 object 뒤의 문자열 을 맞 출 수 있 습 니 다.
(11) Symbol.unscopables
대상 의 Symbol. unscopables 속성 은 대상 을 가리 키 고 있 습 니 다.이 대상 은 with 키 워드 를 사용 할 때 어떤 속성 이 with 환경 에서 제 외 될 지 지정 합 니 다.

좋은 웹페이지 즐겨찾기