Symbol Object
primitive
wrapper 오브젝트가 있음
Symbol()
유일한 값 제공
let sym = Symbol(“설명") 형태
new 연산자 사용불가
실행결과는 오브젝트가 아닌 값
값을 생성한다는 표현이 적합
const sym = Symbol();
// 값을 변경할 수 없으므로 const 변수에 할당가능
console.log(sym);
// 콘솔에 Symbol() 출력
// Symbol 값이 출력되지 않음
// - Symbol 값을 생성한 형태 출력
// type 은 symbol
const symRemark = Symbol(“주석");
생성한 값 변경불가
프로퍼티 설정불가
Symbol 값에 다른 값 연결
String, toString() 으로 변환하여 연결
+ 연산자로 연결불가
let result = sym == Symbol();
// false , 유일한 값 제공
let sym = Symbol(“할인율");
// 파라미터 “할인율” 은 주석, 설명
// tostring 값을 문자열로 변경, valueof - es5
console.log(String(sym)+”연결"); // Symbol(할인율)연결
Object(123) -> / Number 오브젝트 생성
Obeject의 프로퍼티 키로 Symbol 사용
값이 유일하므로 키가 중복되지 않음
symbol-keyed property라고 부름
{“apple”,”사과"} -> 문자열!! 기존에는 엔진에서 문자열로 변환하여 사용하던것임
for-in 에서 사용
프로퍼티 이름으로 Symbol이 열거되지 않음
Symbol은 [[Enumerable]]: false 이기 때문
Object.getOwnPropertySymbols()로 열거
메서드 이름으로 사용가능
let sym = Symbel(“123”);
let obj = {[sym] : “456”};
프로퍼티 key 타입이 String이지만 Symbol 은 문자열이 아님
obj
obj[sym]
obj.sym - X
obj[Symbol(“one”)] = “222”;
열거하기 위해 사용할 수 없음
const symbolOne = Symbol(“one”);
const symbolTwo = Symbol(“two”);
class Sports {
static[symbolOne]() {
return “Symbol -1”;
}
[symbolTwo(){
return “Symbol -2”;
}
}
// 동적으로 메소드를 생성해서 사용 (사용자 선택에 따라서 자동으로)
[symbolOne]() 형태와 같이 대괄호[]안에 Symbol 값이 할당된 변수 지정
여기에 소괄호()를 작성하면 메서드가 됨
symbolOne은 static의 메서드이고 symbolTwo는 prototype에 연결됨
JSON.stringify() 에서 Symbol 값이 문자열로 변환되지 않음
- 프로퍼티가 누락되는 문제발생
Symbol 값 노출 방지
Object.getOwnPropertySymbols()
완전한 것은 아님
- {} 빈오프젝트로 반환됨
Symbol Property
Well-Known Symbols
스펙의 @@iterator 형태
@@는 Symbol을 나타냄
@@iterator는 Symbol.iterator
Symbol.iterator 에서 iterator는 Well-Known Symbol 중 하나
11개
스펙에서 알고리즘에 이름을 부여하고 이름으로 알고리즘을 참조하기 위한것
- 디폴트로 사용되는 알고리즘 유형이름
프로그램에서 well-Known Symbol 작성
프로그램 코드를 먼저 실행
따라서 디폴트 @@iterator 기능을
프로그램에 오버라이딩 할 수 있음
toStringTag
Object.prototype.toString()과 비슷
toString() 으로 인스턴스를 변환하면
“[Object Object]”형태로 변환
한편 function도 “[Object Object]”형태로 변환
명확하게 구분할 수 없음
Symbol.toStringTag로 구분 가능
[Object Object] 에서 두 번째 문자열 지정
예 “ABC” 지정, [object “ABC”] 로 반환
Sports.prototype[Symbol.toStringTag] = “Sports-Function”;
function 마다 타입을 지정할 수 있으므로 명확하게 구분할 수 있음
sportsObj.toString() // [object Sports-Function]
class 는 get[Symbol.toStringTag]() { return “Sports-Function” } 과 같이 사용
isConcatSpreadable
Array.prototype.concat() 에서 배열의 펼침 여부 정의
Array.prototype.concat() 은 다수의 배열 엘리먼트를 연결하여 반환
배열이름[Symbol.isConcatSpreadable] = false
let result = one.concat[two];
two[Symbol.isConcatSpreadable] = false;
two[Symbol.isConcatSpreadable] = true;
unscopables
with 문에서 프로퍼티를 전개하지 않음
사용성이 떨어짐
species
constuctor 을 반환
인스턴스를 생성하므로 결국 인스턴스를 반환하게 됨
Symbole.species 를 오버라이드 하면 다른 인스턴스를 반환할 수 있다는 의미
let arrayObj = {1,2,3};
let sliceOne = arrayObj.slice(1,3);
인스턴스를 반환하므로 다시 호출할 수 있음
즉, 반환된 인스턴스의 메서드를 호출하는 형태
결과값이 설정된 인스턴스 반환
값을 반환하는 것이 아님
Symbol.species 는 static 악세서 프로 퍼티
getter 만 있고 setter 는 없음
빌트인 프로젝트
toPrimitive
자바스크립트의 프리미티브 값
- number, string, boolean, undefined, null, symbol
+ 연산자 특징
앞뒤의 값 타입에 따라 다름
(1+2)는 값을 더하고 (1+”2”) 는 값을 연결
number 이외 타입은 값을 변환
- 숫자에 true더하면 1로 변환하여 더함
숫자,문자열에 Object{} 연결
- ToPrimitive
오버라이트
Object [Symbol.toPrimitive(hint)]
아래의 세가지 모드값을 설정
toPrimitive() 가 호출되는 환경에 따라 엔진이 설정
세가지 모드
Number 환경이면 “number”
String 환경이면 “string”
Number와 String 환경이 아니면 “ default ”
iterator
Array String Genetator
RegExp
match(), replace(), search(), split()
match() 가 호출되면 Symbol.match() 존재 체크
존재하면 Symbol.match() 실행
String.prototype.match 오버라이드
오버라이드 목적
match 방법을 다양하게 작성
단, match 기능은 같아야함
for
let sym = Symbol.for(“sports”);
글로벌 Symbol 레지스트리는 공유 영역
{key:value}
key 값을 유일하도록 정리
글로벌 레지스트리에 저장
Symbol.for(“ABC”) === Symbol.for(“ABC”) // true
keyFor()
let result = Symbol.keyFor(sym123);
글로벌 Symbol 레지스트리에서 값을 반환
toString()
valueOf()
getOwnPropertySymbols()
파라미터의 오프젝트에서 Symbol 을 배열로 반환
Symbol 이외 프로퍼티는 반환하지 않음
JSON.stringify()
자바스트립트 형태 값을 JSON 형태의 문자열로 변환
{key:value} 에서 key가 Symbol 이면 변환에서 제외됨
Symbol 값을 노출 시키지 않으려는 의도
에러가 안나므로 주의