9장. 타입변환과 단축평가

타입 변환


  • 명시적 타입 변환 : 개발자가 의도적으로 값의 타입을 변환하는 것 (=타입 캐스팅)
  • 암묵적 타입 변환 : 자바스크립트 엔진에 의해 암묵적으로 타입이 변환하는 것 (=타입 강제 변환)

ex) 템플릿 리터럴은 표현식의 평과 결과를 문자열 타입으로 암묵적 타입 변환한다.

0 +
  '' - // -> "0"
  0 +
  ''; // -> "0"
1 +
  '' - // -> "1"
  1 +
  ''; // -> "-1"
NaN + ''; // -> "NaN"
Infinity +
  '' - // -> "Infinity"
  Infinity +
  ''; // -> "-Infinity"

true + ''; // "true"

null + ''; // "null"

undefined +
  ''(
    // "undefined"

    Symbol()
  ) +
  ''(
    // TypeError

    {}
  ) +
  ''; // "[object Object]"
Math +
  ''[(10, 20)] + // "[object Math]"
  ''(
    // "10,20"
    function () {}
  ) +
  ''; // "function(){}"
Array + ''; // "function Array() { [native code] }"
  • 숫자 타입 변환 : 산술 연산자 표현식을 평가할 때 숫자 타입이 아니면 암묵적으로 숫자 타입으로 변환한다.
1 - '1'; // 0
1 * '10'; // 10
1 / 'one'; // NaN
  • boolean 타입으로 변환 : 아래의 false값들 외에는 전부 true다.
// false로 평가되는 값들
false;
undefined;
null;
0, -0;
NaN;
(''); // 빈 문자열

명시적 타입 변환

  • 표준 빌트인 생성자 함수 : 객체를 생성하기 위한 함수이며 new 연산자와 함께 호출한다.

  • 표준 빌트인 메서드 : 빌트인 객체의 메서드 (21장에서 자세히!)

  • 문자열 타입으로 변환

// String 생성자 함수를 new 연산자 없이 호출하는 방법
String();

// Object.prototype.toString 메서드를 사용하는 방법.toString();

// 문자열 연결 연산자를 이용하는 방법+ '';
  • 숫자 타입으로 변환
// Numebr 생성자 함수를 new 연산자 없이 호출하는 방법
Numebr();

// parseInt, parseFloat 함수를 사용하는 방법(문자열만 가능)
parseInt('1'); // 1
parseFloat('10.53'); // 10.53

// + 단항 산술 연산자를 이용하는 방법
+'0'; // 0
+true; // 1
+false; // 0

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

Boolean(0); // false
Boolean(1); // true
Boolean(NaN); // false
Boolean(Infinity); // true

Boolean(null); // false
Boolean(undefined); // false

Boolean({}); // true
Boolean([]); // true

// 다중 부정(!!)을 이용한 방법
// 1. 첫번째 부정으로 원래 값을 boolean타입으로 바꾸고 반대로 변환해준다.
// 2. 반대로 출력된 값을 다시 반대로(원래대로) 변환해준다.

!!'x'; // true
!!''; // false

!!0; // false
!!1; // true

단축 평가


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

논리합(||) 혹은 논리곱(&&) 연산의 평가 결과는 불리언 값이 아닐 수도 있다.

// && : 마지막 피연산자를 출력한다.
'Cat' && 'Dog'; // "Dog"

// || : 첫번째 피연산자를 출력한다.
'Cat' || 'Dog'; // "Cat"

위처럼 논리합, 논리곱은 피연산자를 타입 변환하지 않고 그대로 반환한다(=단축평가).

단축평가 : 표현식을 평가하는 도중에 평가 결과가 확정된 경우 나머지 평가 과정을 생략하는 것

'Cat' || 'Dog'; // "Cat"
false || 'Dog'; // "Dog"
'Cat' || false; // "Cat"

'Cat' && 'Dog'; // "Dog"
false && 'Dog'; // false
'Cat' && false; // false
  • 프로퍼티를 참조할 때
var elem = null;
var value = elem.value; // TypeError : Cannot read property 'value' of null

/* ----------------------------------- */

var elem = null;
// elem이 값을 가지고 있으면 elem으로 평가되고
// 값이 없다면(null, undefined) elem.value로 평가된다.
var value = elem && elem.value; // null
  • 함수 매개변수에 기본값을 설정할 때 (undefined로 인한 에러 방지)
function getStringLength(str) {
  str = str || '';
  return str.length;
}

getStringLength(); // 0 (undefined 에러가 발생하지 않는다.)
getStringLength('hi'); // 2

/* ------------------------------------------- */

function getStringLength(str = '') {
  // 매개변수의 기본값 설정
  return str.length;
}

getStringLength(); // 0
getStringLength('hi'); // 2
  • 옵셔널 체이닝 연산자 (좌항의 피연산자가 null 또는 undefined인 경우만 undeifned를 반환하고, 그렇지 않으면 우항의 프로퍼티 참조를 이어간다.)
var elem = null;

var value = elem?.value;
console.log(value); // elem이 null이기 때문에 undefined를 반환
  • null 병합 연산자 (좌항이 null 또는 undefined인 경우 우항을 반환하고, 그렇지 않으면 좌항을 반환한다.)
// null 병합 연산자는 변수에 기본값을 설정할 때 유용하다.
var foo = null ?? 'default string';
console.log(foo); // "default string
Last Updated: