9.1 타입 변환이란?

  • 명시적 타입 변환(explicit coercion) : 개발자 / 의도적 (=타입 캐스팅type casting)
  • 암묵적 타입 변환(implicit coercion) : 엔진 / 암묵적 (=타입 강제 변환type coercion)
  • 기존 원시 값을 직접 변경하는 것은 아님
var x = 10; //숫자형 변수

var str = x + ""; //변수 x 숫자형으로 암묵적 타입 변환
console.log(typeof str, str); //string 10
console.log(typeof x, x); //number 10

9.2 암묵적 타입 변환

  • 원시 타입 중 하나로 타입을 자동 변환

    9.2.1 문자열 타입으로 변환

      • 연산자
    • 템플릿 리터럴의 표현식 삽입
    //+연산자
    str1 = 1 + "2";
    console.log(typeof str1, str1); // string 12
    
    //템플릿 리터럴
    str2 = `1+1=${1 + 1}`;
    console.log(typeof str2, str2); // string 1+1=2
    
    // 숫자 타입
    0 + ''         // -> "0"
    -0 + ''        // -> "0"
    1 + ''         // -> "1"
    -1 + ''        // -> "-1"
    NaN + ''       // -> "NaN"
    Infinity + ''  // -> "Infinity"
    -Infinity + '' // -> "-Infinity"
    
    // 불리언 타입
    true + ''  // -> "true"
    false + '' // -> "false"
    
    // null 타입
    null + '' // -> "null"
    
    // undefined 타입
    undefined + '' // -> "undefined"
    
    // 심벌 타입
    (Symbol()) + '' // -> TypeError: Cannot convert a Symbol value to a string
    
    // 객체 타입
    ({}) + ''           // -> "[object Object]"
    Math + ''           // -> "[object Math]"
    [] + ''             // -> ""
    [10, 20] + ''       // -> "10,20"
    (function(){}) + '' // -> "function(){}"
    Array + ''          // -> "function Array() { [native code] }"
    

    9.2.2 숫자 타입으로 변환

    • 산술 연산자 (변환 불가 → 표현식 평가 결과 NaN)
    • 비교 연산자 (피연산자 숫자 타입으로 암묵적 타입 변환)
      • 단항 연산자
    // + 단항 연산자를 이용한 숫자 타입으로 변환 중
    
    +null + // => 0
      undefined + // => NaN
      Symbol() + // => TypeError: Cannot convert a Symbol value to a number
      {} + // => NaN
      [] + // => 0
      [10, 20] + // => NaN
      function () {}; // => NaN
    

    9.2.3 불리언 타입으로 변환

    • Truthy 값(True로 평가) 과 Falsy 값(False로 평가)
    • Falsy 값 : false, undefined, null, 0, -0, NaN, ‘’(빈 문자열)
    • Truthy 값은 Falsy 제외한 나머지

9.3 명시적 타입 변환

9.3.1 문자열 타입으로 변환

  1. String 생성자 함수를 new 연산자 없이 호출
  2. Object.prototype.toString 매서드 사용
  3. 문자열 연결 연산자 (+)
//1.
String(1); // ->"1"
String(true); // ->"ture"

//2.
(1).toString(); // -> "1"
true.toString(); // -> "true"

//3.
1 + ""; // -> "1"
true + ""; // -> "true"

9.3.2 숫자 타입으로 변환

  1. Number 생성자 함수 new 연산자 없이 호출
  2. parseInt, parseFloat 함수 사용 (문자열만 숫자 타입 변환 가능)
  3. 단항 산술 연산자 +
  4. 산술 연산자 *
//1.
Number("0"); // -> 0
Number(true); // -> 1

//2.
parseInt("0"); // -> 0
parseFloat("10.53"); // -> 10.53

//3.
+"0"; // -> 0
+true; // -> 1

//4.
"0" * 1; // -> 0
true * 1; // -> 0

9.3.3 불리언 타입으로 변환

  1. Boolean 생성자 함수 new 연산자 없이 호출
    • Falsy 값이 들어가면 false로. 나머지는 true
    • Falsy 값 : false, undefined, null, 0, -0, NaN, ‘’(빈 문자열)
  2. ! 부정 논리 연산자를 두 번 사용
    • 마찬가지로 Falsy 값 false, 나머지는 true
//1. 나머지는 true
Boolean(undefined); // -> false
Boolean(null); // -> false
Boolean(0); // -> false
Boolean(-0); // -> false
Boolean(NaN); // -> false
Boolean(""); // -> false

//2.
!!undefined; //-> false
!!null; //-> false
!!NaN; //-> false
!!""; //-> false
!!0; //-> false

9.4 단축 평가

9.4.1 논리 연산자를 사용한 단축 평가

단축 평가 표현식 평가 결과
true || anything true
false || anything anything
true && anything anything
false && anything false

→ 결과가 확정된 경우 나머지 평가 과정을 생략

→ 논리 연산의 결과를 결정하는 값이 평가 결과가 됨.

→ if 문 대체 가능

var done = true;
var message = "";

// 주어진 조건이 true일 때
if (done) message = "완료";

// if 문은 단축 평가로 대체 가능하다.
// done이 true라면 message에 '완료'를 할당
message = done && "완료";
console.log(message); // 완료
var done = false;
var message = "";

// 주어진 조건이 false일 때
if (!done) message = "미완료";

// if 문은 단축 평가로 대체 가능하다.
// done이 false라면 message에 '미완료'를 할당
message = done || "미완료";
console.log(message); // 미완료

9.4.2 옵셔널 체이닝 연산자

  • ?.
  • 좌항 null, undefined → undefined 반환
  • 그렇지 않으면, 우항 프로퍼티 참조 이어감
  • 객체를 가리키기를 기대하는 변수가 null 또는 undefined가 아닌지 확인하고 프로퍼티를 참조할 때 유용
var elem = null;

// elem이 null 또는 undefined이면 undefined를 반환하고, 그렇지 않으면 우항의 프로퍼티 참조를 이어간다.
var value = elem?.value;
console.log(value); // undefined
var elem = null;

// elem이 Falsy 값이면 elem으로 평가되고 elem이 Truthy 값이면 elem.value로 평가된다.
var value = elem && elem.value;
console.log(value); // null
  • ES11(ECMAScript2020)에서 도입됐다. 그 전에는 바로 위 예제 처럼 && 연산자를 이용한 단축 평가를 활용하여 ?. 옵셔널 체인징을 대체.

9.4.3 null 병합 연산자

  • ??
  • 좌항 null, undefined → 우항 피연산자 반환
  • 그렇지 않으면, 좌항 피연산자 반환
  • 변수의 기본값을 설정할 떄 유용
// 좌항의 피연산자가 null 또는 undefined이면 우항의 피연산자를 반환하고, 그렇지 않으면 좌항의 피연산자를 반환한다.
var foo = null ?? "default string";
console.log(foo); // "default string"
// Falsy 값인 0이나 ''도 기본값으로서 유효하다면 예기치 않은 동작이 발생할 수 있다.
var foo = "" || "default string";
console.log(foo); // "default string"
// 좌항의 피연산자가 Falsy 값이라도 null 또는 undefined가 아니면 좌항의 피연산자를 반환한다.
var foo = "" ?? "default string";
console.log(foo); // ""





이 포스트는 모던 자바스크립트 Deep Dive를 공부하며 정리한 내용입니다.