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 값을 노출 시키지 않으려는 의도

    • 에러가 안나므로 주의

results matching ""

    No results matching ""