ES6 학습 노트 (8) 기호
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)'
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
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 환경 에서 제 외 될 지 지정 합 니 다.이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.