[JavaScript] 딥다이브 / 9장 타입 변환과 단축 평가

ungnam·2023년 6월 13일
0
post-thumbnail

타입 변환

암묵적 타입 변환

개발자의 의도와 상관 없이 표현식 평가 도중 JS 엔진에 의해 암묵적으로 타입이 자동 변환되는 것을 의미, type coercion이라고도 한다.

  1. 문자열 타입으로 변환

피연산자 중 하나 이상이 문자열인 경우 문자열 연결 연산자로 동작
-> 나머지 피연산자가 문자열 타입으로 암묵적 타입 변환됨

// 참고
(Symbol()) + ''		// TypeError
({}) + ''			// [Object object]
Math + ''			// [Object Math]
[] + ''				// ''
[10, 20] + ''		// '10,20'
(function(){}) + ''	// function(){}
Array + ''			// function Array() { [native code] }
  1. 숫자 타입으로 변환

산술 연산자의 특성 상 숫자가 아닌 피연산자를 숫자 타입으로 암묵적 타입 변환함

빈 문자열(''), 빈 배열([]), null, false -> 0
true -> 1
객체, 빈 배열이 아닌 배열, undefined -> NaN

  1. 불리언 타입으로 변환

if문과 for문과 같은 제어문 또는 삼항 연산자의 조건식의 경우 불리언 값으로 평가되어야 함 -> 조건식의 평가 결과를 불리언 타입으로 암묵적 타입 변환함

falsy 값(false, undefined, null, 0/-0, NaN, '') -> false
falsy 값을 제외한 나머지 값 -> true

명시적 타입 변환

개발자가 의도적으로 값의 타입을 변환하는 것을 의미, type-casting이라고도 부른다.

  • 표준 빌트인 생성자 함수(String, Number, Boolean)을 new 연산자 없이 호출하는 경우
  • 빌트인 메서드를 사용하는 경우(toString, parseInt/parseFloat 등)
  • 암묵적 타입 변환을 이용하는 경우

    암묵적 타입 변환을 이용하는 경우

    1. 문자열 타입으로 변환하기 위해 문자열 연결 연산자 이용
    2. 숫자 타입으로 변환하기 위해 +, * 산술 연산자 이용
    3. 불리언 타입으로 변환하기 위해 ! 부정 논리 연산자를 두 번 사용

단축 평가

표현식을 평가하는 도중 평가 결과가 확정된 경우 나머지 평가 과정을 생략하는 것을 의미한다.

논리 연산자

논리곱(&&) 연산자와 논리합(||) 연산자는 논리 연산의 결과를 결정하는 피연산자를 타입 변환하지 않고 그대로 반환한다.

  • true || anything -> true
  • false || anything -> anything
  • true && anything -> anything
  • false && anything -> false

optional chaining(?.)

좌항의 피연산자가 null 또는 undefined인 경우 undefined를 반환하고 그렇지 않으면 우항의 프로퍼티 참조를 이어감

var str = '';

var length = str && str.length;
console.log(length); // ''

논리곱을 통해 ?.와 유사하게 구현이 가능하나 좌항이 falsy 값인 0이나 ''일 때도 우항이 반환되는데, 0이나 ''객체로 평가(래퍼 객체)될 때도 있기 때문에 이 경우 ?. 사용이 더 바람직하다.

var str = '';

var length = str?.length;
console.log(length); // 0

nullish coalescing(??)

좌항의 피연산자가 null 또는 undefined인 경우 우항의 피연산자를 반환하고 그렇지 않으면 좌항의 피연산자를 반환

var foo = '' || 'default string';
console.log(foo); // 'default string'

논리합을 통해 ??와 유사하게 구현이 가능하나 만약 falsy 값인 0이나 ''도 기본값으로 유효한 경우에는 위와 같이 예기치 않은 동작이 발생할 수 있다. 따라서 이 경우 ?? 사용이 더 바람직하다.

var foo = '' ?? 'default string';
console.log(foo); // ''
profile
꾸준함을 잃지 말자.

0개의 댓글