5 분 소요

09장 타입 변환과 단축 평가

9.1 타입 변환이란?

  • 개발자가 의도적으로 값의 타입을 변환하는 것을 명시적 타입 변환 또는 타입 캐스팅이라 한다.
  • 개발자의 의도와는 상관없이 표현식을 평가하는 도중에 자바스크립트 엔진에 의해 암묵적으로 타입이 자동 변환되는 것을 암묵적 타입 변환 또는 타입 강제 변환이라 한다.

9.2 암묵적 타입 변환

  1. 문자열 타입으로 변환
    1. ES6에 도입된 템플릿 리터럴의 표현식 삽입

       `1 + 1 = ${1 + 1}` // -> "1 + 1 = 2"
      
    2. 문자열 타입 아닌 값을 문자열 타입으로 암묵적 타입 변환을 수행할 때 다음과 같이 동작

       // 숫자 타입
       1 + ''  // '1'
       NaN = ''  // 'NaN'
              
       // 불리언 타입
       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] }"
      
  2. 숫자 타입으로 변환

     // 문자열 타입
     +''  // -> 0
     +'0'  // -> 0
     +'1'  // -> 1
     +'string'  // -> NaN
        
     // 불리언 타입
     +true  // -> 1
     +false  // -> 0
        
     // null 타입
     +null  // -> 0
        
     // undefined 타입
     +undefined  // -> NaN
        
     // 심벌 타입
     +Symbol()  // -> TypeError: Cannot convert a Symbol value to a number
        
     // 객체 타입
     +{}  // -> NaN
     +[]  // -> 0
     +[10, 20]  // -> NaN
     +(function(){})  // -> NaN
    
  3. 불리언 타입으로 변환
    1. 자바스크립트 엔진은 불리언 타입이 아닌 값을 Truthy 값(참으로 평가되는 값) 또는 Falsy 값(거짓으로 평가되는 값)으로 구분한다.
      1. 제어문의 조건식과 같이 불리언 값으로 평가되어야 할 문맥에서 Truthy 값은 true로, Falsy 값은 false로 암묵적으로 타입 변환된다.
      2. false로 평가되는 Falsy 값
        1. false
        2. undefined
        3. null
        4. 0, -0
        5. NaN
        6. ‘ ‘(빈 문자열)
      3. Falsy 값 외의 모든 값은 모두 true로 평가되는 Truthy 값
    2. 다음 예제는 Truthy/Falsy 값을 판별하는 함수다.

       // 전달받은 인수가 Falsy 값이면 true, Truthy 값이면 false를 반환한다.
       function isFalsy(v) {
       	return !v;
       }
              
       // 전달받은 인수가 Truthy 값이면 true, Falsy 값이면 false를 반환한다.
       function isTruthy(v) {
       	return !!v;
       }
              
       // 모두 true를 반환한다.
       isFalsy(false);
       isFalsy(undefined);
       isFalsy(null);
       isFalsy(0);
       isFalsy(NaN);
       isFalsy('');
              
       // 모두 true를 반환한다.
       isTruthy(true);
       isTruthy('0'); // 빈 문자열이 아닌 문자열을 Truthy 값이다.
       isTruthy({});
       isTruthy([]);
      

9.3 명시적 타입 변환

  1. 문자열 타입으로 변환
    1. String 생성자 함수를 new 연산자 없이 호출하는 방법

       // 숫자 타입 => 문자열 타입
       String(1);  // -> "1"
       String(NaN);  // -> "NaN"
       String(Infinity);  // -> "Infinity"
              
       // 불리언 타입 => 문자열 타입
       String(true);  // -> "true"
       String(false);  // -> "false"
      
    2. Object.prototype.toString 메서드를 사용하는 방법

       // 숫자 타입 => 문자열 타입
       (1).toString();  // -> "1"
       (NaN).toString();  // -> "NaN"
       (Infinity).toString();  // -> "Infinity"
              
       // 불리언 타입 => 문자열 타입
       (true).toString();  // -> "true"
       (false).toString();  // -> "false"
      
    3. 문자열 연결 연산자를 이용하는 방법

       // 숫자 타입 => 문자열 타입
       1 + '';  // -> "1"
       NaN + '';  // -> "NaN"
       Infinity + '';  // -> "Infinity"
              
       // 불리언 타입 => 문자열 타입
       true + '';  // -> "true"
       false + '';  // -> "false"
      
  2. 숫자 타입으로 변환
    1. Number 생성자 함수를 new 연산자 없이 호출하는 방법

       // 문자열 타입 =>숫자 타입
       Number('0');  // -> 0
       Number('-1');  // -> -1
       Number('10.53');  // -> 10.53
              
       // 불리언 타입 => 숫자 타입
       Number(true);  // -> 1
       Number(false);  // -> 0
      
    2. parseInt, parseFloat 함수를 사용하는 방법(문자열만 숫자 타입으로 변환 가능)

       // 문자열 타입 =>숫자 타입
       parseInt('0');  // -> 0
       parseInt('-1');  // -> -1
       parseFloat('10.53');  // -> 10.53
      
      • 단항 산술 연산자를 이용하는 방법
       // 문자열 타입 =>숫자 타입
       +'0';  // -> 0
       +'-1';  // -> -1
       +'10.53';  // -> 10.53
              
       // 불리언 타입 => 숫자 타입
       +true;  // -> 1
       +false;  // -> 0
      
      • 산술 연산자를 이용하는 방법
       // 문자열 타입 =>숫자 타입
       '0' * 1;  // -> 0
       '-1' * 1;  // -> -1
       '10.53' * 1;  // -> 10.53
              
       // 불리언 타입 => 숫자 타입
       true * 1;  // -> 1
       false * 1;  // -> 0
      
  3. 불리언 타입으로 변환
    1. Boolean 생성자 함수를 new 연산자 없이 호출하는 방법

       // 문자열 타입 => 불리언 타입
       Boolean('x');  // -> true
       Boolean('');  // -> false
       Boolean('false');  // -> true
              
       // 숫자 타입 => 불리언 타입
       Boolean(0);  // -> false
       Boolean(1);  // -> true
       Boolean(NaN);  // -> false
       Boolean(Infinity);  // -> true
              
       // null 타입 => 불리언 타입
       Boolean(null);  // -> false
              
       // undefined 타입 => 불리언 타입
       Boolean(undefined);  // -> false
              
       // 객체 타입 => 불리언 타입
       Boolean({});  // -> true
       Boolean([]);  // -> true
      
    2. ! 부정 논리 연산자를 두 번 사용하는 방법

       // 문자열 타입 => 불리언 타입
       !!'x';  // -> true
       !!'';  // -> false
       !!'false';  // -> true
              
       // 숫자 타입 => 불리언 타입
       !!0;  // -> false
       !!1;  // -> true
       !!NaN;  // -> false
       !!Infinity;  // -> true
              
       // null 타입 => 불리언 타입
       !!null;  // -> false
              
       // undefined 타입 => 불리언 타입
       !!undefined;  // -> false
              
       // 객체 타입 => 불리언 타입
       !!{};  // -> true
       !![];  // -> true
      

9.4 단축 평가

  1. 논리 연산자를 사용한 단축 평가
    1. 논리 연산의 결과를 결정하는 피연산자를 타입 변환하지 않고 그대로 반환하는 것을 단축 평가라 한다.
      1. 단축평가는 표현식을 평가하는 도중에 평가 결과가 확정된 경우 나머지 평가 과저을 생략하는 것을 말한다.

        단축 평가 표현식 평가 결과    
        true   anything true
        false   anything anything
        true && anything anything    
        false && anything false    
      2. 단축 평가를 사용하면 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) // 미완료
        
      3. 참고로 삼항 조건 연산자는 if…else문으로 대체할 수 있다.

         var done = true;
         var message = ' ';
                    
         // if..else 문
         if (done) message = '완료';
         else message = '미완료';
         console.log(message); // 완료
                    
         // if..else 문은 삼항 조건 연산자로 대체 가능하다.
         message = done ? '완료' : '미완료';
         console.log(message) // 완료
        
  2. 옵셔널 체이닝 연산자
    1. 옵셔널 체이닝 연산자 ?. 는 좌항의 피연산자가 null 또는 undefined를 반환하고, 그렇지 않으면 우항의 프로퍼티 참조를 이어간다.

       var elem = null;
              
       // elem이 null 또는 undefined이면 undefined를 반환하고, 
       //그렇지 않으면 우항의 프로퍼티 참조를 이어간다.
       var value = elem?.value;
       console.log(value); // undefined
      
       var str = '';
              
       // 문자열의 길이(length)를 참조한다. 이때 좌항 피연산자가 false로 평가되는 Falsy 값이라도
       // null 또는 undefined가 아니면 우항의 프로퍼티 참조를 이어간다.
       var length = str?.length;
       console.log(length); // 0
      
  3. null 병합 연산자
    1. null 병합 연산자 ??는 좌항의 피연산자가 null 또는 undefined인 경우 우항의 피연산자를 반환하고, 그렇지 않으면 좌항의 피연산자를 반환한다.

       var foo = null ?? 'default string';
       	console.log(foo); // "default string"
      
    2. 좌항의 피연산자가 false로 평가되는 Falsy 값(false, undefined, null, 0, -0, NaN, ‘ ’)이라도 null 또는 undefined가 아니면 좌항의 피연산자는 그대로 반환한다.

       // 좌항의 피연산자가 Falsy값이라도 null 또는 undefined가 아니면 좌항의 피연산자를 반환한다.
       var foo = '' ?? 'default string';
       console.log(foo); // ""
      

댓글남기기