반응형
Jake Seo
제이크서 위키 블로그
Jake Seo
전체 방문자
오늘
어제
  • 분류 전체보기 (715)
    • 일상, 일기 (0)
    • 백준 문제풀이 (1)
    • 릿코드 문제풀이 (2)
    • 알고리즘 이론 (10)
      • 기본 이론 (2)
      • 배열과 문자열 (8)
    • 데이터베이스 (15)
      • Planet Scale (1)
      • MSSQL (9)
      • 디비 기본 개념 (1)
      • SQLite 직접 만들어보기 (4)
    • 보안 (7)
    • 설계 (1)
    • 네트워크 (17)
      • HTTP (9)
      • OSI Layers (5)
    • 회고 (31)
      • 연간 회고 (2)
      • 주간 회고 (29)
    • 인프라 (52)
      • 도커 (12)
      • AWS (9)
      • 용어 (21)
      • 웹 성능 (1)
      • 대규모 서비스를 지탱하는 기술 (9)
    • 깃 (7)
    • 빌드 도구 (7)
      • 메이븐 (6)
      • 그레이들 (0)
    • Java (135)
      • 이펙티브 자바 (73)
      • 자바 API (4)
      • 자바 잡지식 (30)
      • 자바 디자인 패턴 (21)
      • 톰캣 (Tomcat) (7)
    • 프레임워크 (64)
      • next.js (14)
      • 스프링 프레임워크 (28)
      • 토비의 스프링 (6)
      • 스프링 부트 (3)
      • JPA (Java Persistence API) (5)
      • Nest.js (8)
    • 프론트엔드 (48)
      • 다크모드 (1)
      • 노드 패키지 관리 매니저 (3)
      • CSS (19)
      • Web API (11)
      • tailwind-css (1)
      • React (5)
      • React 새 공식문서 요약 (1)
      • HTML (Markup Language) (5)
    • 자바스크립트 (108)
      • 모던 자바스크립트 (31)
      • 개념 (31)
      • 정규표현식 (5)
      • 코드 스니펫 (1)
      • 라이브러리 (6)
      • 인터뷰 (24)
      • 웹개발자를 위한 자바스크립트의 모든 것 (6)
      • 팁 (2)
    • Typescript (49)
    • 리눅스와 유닉스 (10)
    • Computer Science (1)
      • Compiler (1)
    • IDE (3)
      • VSCODE (1)
      • IntelliJ (2)
    • 세미나 & 컨퍼런스 (1)
    • 용어 (개발용어) (16)
      • 함수형 프로그래밍 용어들 (1)
    • ORM (2)
      • Prisma (2)
    • NODEJS (2)
    • cypress (1)
    • 리액트 네이티브 (React Native) (31)
    • 러스트 (Rust) (15)
    • 코틀린 (Kotlin) (4)
      • 자바에서 코틀린으로 (4)
    • 정규표현식 (3)
    • 구글 애널리틱스 (GA) (1)
    • SEO (2)
    • UML (2)
    • 맛탐험 (2)
    • 리팩토링 (1)
    • 서평 (2)
    • 소프트웨어 공학 (18)
      • 테스팅 (16)
      • 개발 프로세스 (1)
    • 교육학 (1)
    • 삶의 지혜, 통찰 (1)
    • Chat GPT (2)
    • 쉘스크립트 (1)
    • 컴파일 (2)
    • Dart (12)
    • 코드팩토리의 플러터 프로그래밍 (4)
    • 플러터 (17)
    • 안드로이드 스튜디오 (1)
    • 윈도우즈 (1)
    • 잡다한 백엔드 지식 (1)
    • 디자인 패턴 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • item8
  • Java
  • 프로그래머의 뇌
  • 외래키 제약조건
  • 싱글톤 패턴
  • 알고리즘
  • 자바 검증
  • 추상 팩터리 패턴
  • 자바 디자인패턴
  • 이펙티브 자바 item9
  • 슬로우 쿼리
  • item9
  • 서버리스 컴퓨팅
  • 자바스크립트
  • 스프링 검증
  • 작업기억공간
  • 이펙티브자바
  • 도커공식문서
  • serverless computing
  • 느린 쿼리
  • 토비의 스프링
  • 빈 검증
  • pnpm
  • 메이븐 골
  • Next.js
  • 메이븐 라이프사이클
  • prerendering
  • MSSQL
  • 자료구조
  • 객체복사
  • 자바
  • 자바스크립트 인터뷰
  • try-with-resources
  • 러스트
  • 디자인패턴
  • bean Validation
  • 싱글턴
  • Pre-rendering
  • 플라이웨이트패턴
  • NEXT JS
  • Javadoc 자바독 자바주석 주석 Comment
  • 메이븐 페이즈
  • 자바스크립트 면접
  • next js app
  • item7
  • 이펙티브 자바
  • 싱글톤
  • 참조 해제
  • 팩터리 메서드 패턴
  • rust

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Jake Seo

제이크서 위키 블로그

자바스크립트/개념

자바스크립트의 Symbol.toPrimitive 란?

2023. 1. 1. 11:30

Symbol.toPrimitive 란?

  • 잘 알려진 심볼 중 하나이다.
  • 강제 타입변환 시에 타입변환 힌트를 받아들이고, 어떤 원시 타입을 반환할지에 대한 메서드를 정의할 수 있다.
  • 객체를 primitive value 로 변경하는 강력한 방법을 제공한다.
    • JS 에서는 다양한 경우에 값을 강제로 변환한다.
    • ex) +object 인 경우 숫자로 강제 변환한다. String(object) 인 경우엔 문자열로 변환한다.
    • 내부적으로 hint 라는 인자를 받게 된다.
    • number, string, default 중 하나를 받아 선호하는 타입이 무엇인지 체크할 수 있다.
  • 모든 타입 변환 알고리즘에서 우선순위를 갖는다.
    • toString() 이나 valueOf() 보다 앞선 우선순위를 갖는다.
      • toString() 은 해당 타입을 문자열로 변환할 때 사용한다.
      • valueOf() 는 해당 타입을 오브젝트로 변환할 때 사용한다.

객체의 [Symbol.toPrimitive] 오버라이드 해보기

const normalObject = {};

console.log(+normalObject); // NaN
console.log(`${normalObject}`); // [object Object]
console.log("" + normalObject); // [object Object]

const object1 = {
  // hint 를 이용한 로직을 작성할 수 있다.
  [Symbol.toPrimitive](hint) {
    console.log(`hint was ${hint}`);

    if (hint === "number") {
      return 42;
    }

    if (hint === "string") {
      return "forty two";
    }

    return "default";
  },
};

// hint: number
console.log(+object1); // 42

// hint: string
// 템플릿 리터럴 내의 오브젝트는 String(object1); 을 한 것과 동일하다.
// 타입을 primitive string 으로 바꿔준다.
console.log(`${object1}`); // "forty two"

// hint: default
// 더하기 연산자는 문자열과 숫자 모두 가능하다.
console.log("" + object1); // "default"

타입 강제변환 시 들어온 힌트에 따라 적절한 형태의 primitive type 으로 변환할 수 있다. 용도 자체가 primitive type 으로 변환시키기 위한 접근자 프로퍼티여서, primitive type 이 아닌 다른 타입으로 반환하면, 아래와 같은 에러를 만날 수 있다.

Uncaught TypeError: Cannot convert object to primitive value

직접 호출한다면?

const object1 = {
  [Symbol.toPrimitive](hint) {
    console.log(`hint was ${hint}`);

    if (hint === "number") {
      return 42;
    }

    if (hint === "string") {
      return "forty two";
    }

    return "default";
  },
};

console.log(object1[Symbol.toPrimitive]());
// hint was undefined
// default

보통 직접 호출할 일은 없지만, 직접 호출하면 힌트로는 undefined 가 적용된다.

기본 정의 살펴보기

[Symbol.toPrimitive](hint) {
  let methods = hint === "string"
          ? ["toString", "valueOf"]
          : ["valueOf", "toString"];

  for (const methodName of methods) {
    const method = this[methodName];

    if(typeof method === "function") {
      const result = method.call(this);
      if(result === null || typeof result !== "object") {
        return result;
      }
    }
  }

  throw new TypeError();
};

힌트가 string 으로 들어오면, toString() 이 함수로 정의되어 있는지 먼저 확인하고 호출해본다. 이후 결과 값이 적절한지 판단 후 반환한다. stirng 이 아니라면, valueOf() 를 우선순위로 두고 같은 동작을 한다.

만일 적절한 메서드가 없다면 TypeError 를 던진다.

Date 의 toPrimitive 동작 살펴보기

const date = new Date();
console.log(String(date)); // hint: string, Tue Jan 31 2023 00:03:19 GMT+0900 (한국 표준시)
console.log(+date); // hint: number, 1675090999694
console.log("" + date); // hint: default,  Tue Jan 31 2023 00:03:19 GMT+0900 (한국 표준시)
console.log(date[Symbol.toPrimitive]()); // hint: undefined, Uncaught TypeError: Invalid hint: undefined
  • default 일 때와 string 일 때가 같다.
  • undefined 인 경우 에러가 난다.
반응형
저작자표시 비영리 (새창열림)

'자바스크립트 > 개념' 카테고리의 다른 글

자바스크립트 오브젝트 프로퍼티의 순서  (0) 2023.01.01
Object.prototype.valueOf() 란?  (0) 2023.01.01
데이터 프로퍼티 (data property)와 접근자 프로퍼티 (accessor property) 란?  (0) 2023.01.01
자바스크립트의 Descriptor 란? (feat. Object.defineProperty())  (0) 2023.01.01
Symbol.species 심볼과 용례  (0) 2022.12.24
    '자바스크립트/개념' 카테고리의 다른 글
    • 자바스크립트 오브젝트 프로퍼티의 순서
    • Object.prototype.valueOf() 란?
    • 데이터 프로퍼티 (data property)와 접근자 프로퍼티 (accessor property) 란?
    • 자바스크립트의 Descriptor 란? (feat. Object.defineProperty())
    Jake Seo
    Jake Seo
    ✔ 잘 보셨다면 광고 한번 클릭해주시면 큰 힘이 됩니다. ✔ 댓글로 틀린 부분을 지적해주시면 기분 나빠하지 않고 수정합니다. ✔ 많은 퇴고를 거친 글이 좋은 글이 된다고 생각합니다. ✔ 간결하고 명료하게 사람들을 이해 시키는 것을 목표로 합니다.

    티스토리툴바