[모던 자바스크립트 Deep Dive] 타입 변환과 단축 평가

이은지·2025년 1월 30일
0

모던 자바스크립트 Deep Dive 9장을 읽고 정리한 글이다.

1. 타입 변환이란?

  • 값의 타입은 개발자의 의도에 따라 다른 타입을 변환 가능함
  • 의도적으로 값의 타입을 변환하는 것을 명시적 타입 변환 또는 타입 캐스팅이라 함
var x = 10;

//명시적 타입 변환
//숫자를 문자열로 타입 캐스팅한다. 
var str = x.toString();
  • 개발자의 의도와는 상관없이 표현식을 평가하는 도중 자바스크립트 엔진에 의해 암묵적으로 타입이 자동 변환되는 것을 암묵적 타입 변환 또는 타입 강제 변환이라 함
var x = 10;

//암묵적 타입 변환
//문자열 연결 연산자는 숫자 타입 x의 값을 바탕으로 새로운 문자열을 생성 
var str = x + '';
  • 타입 변환이란 기존 원시 값(x변수의 값)을 사용해 다른 타입의 새로운 원시 값을 생성하는 것
  • 명시적 타입 변환은 타입을 변경하겠다는 의도가 코드에 명백히 드러나지만, 암묵적 타입 변환은 드러나지 않으므로 코드를 예측할 수 있어야 함
    • 이를 위해 타입 변환이 어떻게 동작하는지 정확히 이해하는 것이 중요

2. 암묵적 타입 변환

  • 암묵적 타입 변환이 발생하면 문자열, 숫자, 불리언과 같은 원시 타입 중 하나로 타입을 자동 변환

2.1 문자열 타입으로 변환

  • 자바스크립트 엔진은 문자열 연결 연산자 표현식을 평가하기 위해 문자열 연결 연산자의 피연산자 중에서 문자열 타입이 아닌 피연산자를 문자열 타입으로 암묵적 타입 변환
1 + '2' // → "12"
  • 템플릿 리터럴 표현식 삽입 또한 표현식의 평가 결과를 문자열 타입으로 암묵적 타입 변환
`1 + 1 = ${1 + 1}` // → "1 + 1 = 2"

2.2 숫자 타입으로 변환

  • 자바스크립트 엔진은 산술 연산자, 비교 연산자 표현식을 평가하기 위해 산술 연산자의 피연산자 중에서 숫자 타입이 아닌 피연산자를 숫자 타입으로 암묵적 타입 변환
  • 이때 피연산자를 숫자 타입으로 변환할 수 없는 경우는 산술 연산을 수행할 수 없으므로 표현식의 평가 결과는 NaN이 됨
// 문자열 타입
+ "" // → 0
+'0' // → 0
+'1' // → 1
' s t r i n g ' // → NaN

// 불리언 타입
+ true // → 1
+ false // → 0

// null 타입
+ null  // → 0

// undefined 타입
+ undefined  // → NaN

// 심벌 타입
+ Symbol() // → TypeError: Cannot convert a Symbol value to anumber

// 객체 타입
+{} // → NaN
+[] 1 // → 0
+[10, 20] // → NaN
+ ( function(){} ) // → NaN

2.3 불리언 타입으로 변환

  • 자바스크립트 엔진은 조건식의 평가 결과를 불리언 타입으로 암묵적 타입 변환
  • 자바스크립트 엔진은 불리언 타입이 아닌 값을 Truthy 값(참으로 평가되는 값) 또는 Falsy 값(거짓으로 평가되는 값)으로 구분
  • false로 평가되는 Falsy 값
    • false
    • undefined
    • null
    • 0, -0
    • NaN
    • ''(빈 문자열)
  • Falsy값 외의 모든 값은 모두 true로 평가되는 Truthy 값

3. 명시적 타입 변환

3.1 문자열 타입으로 변환

  • String 생성자 함수를 new 연산자 없이 호출
    • ex: String(1)
  • Object.prototype.toString 메서드를 사용
    • ex: (1).toString()
  • 문자열 연결 연산자를 이용
    • ex: 1 + ''

3.2 숫자 타입으로 변환

  • Number 생성자 함수를 new 연산자 없이 호출
    • ex: Number('0')
  • parseInt, parseFloat 함수를 사용(문자열만 숫자 타입으로 변환 가능)
    • ex: parseInt('0'), parseFloat('10.53')
  • + 단항 산술 연산자를 이용
    • ex: +'0'
  • * 산술 연산자를 이용
    • ex: '0' * 1

3.3 불리언 타입으로 변환

  • Boolean 생성자 함수를 new 연산자 없이 호출
    • ex: Boolean('x')
  • ! 부정 논리 연산자를 두 번 사용
    • ex: !!'x'

4. 단축 평가

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

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

  • 논리합(||)또는 논리곱(&&)연산자 표현식은 언제나 2개의 피연산자 중 어느 한쪽으로 평가됨
  • 논리곱 연산자는 두 개의 피연산자가 모두 true로 평가될 때 true를 반환, 즉 두 번째 피연산자가 평가 결과를 결정
  • 이때 논리곱 연산자는 논리 연산의 결과를 결정하는 두 번째 피연산자를 그대로 반환
'Cat' && 'Dog' // → "Dog"
  • 논리합 연산자는 두 개의 피연산자 중 하나만 true로 평가되어도 true를 반환
  • 이때 논리합 연산자는 논리 연산의 결과를 결정한 피연산자를 그대로 반환
'Cat' && 'Dog' // → "Cat"

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

  • 단축 평가를 사용하면 if문을 대체할 수 있음

    • 어떤 조건이 Truthy 값일 때 무언가를 해야한다면 논리곱 연산자 표현식으로 대체 가능

      var done = true;
      var message = "";
      
      //주어진 조건이 true일 때
      if(done) message = '완료';
      
      //단축 평가: done이 true라면 message에 '완료'를 할당
      message = done && '완료'
    • 어떤 조건이 Falsy 값일 때 무언가를 해야한다면 논리합 연산자 표현식으로 대체 가능

      var done = true;
      var message = "";
      
      //주어진 조건이 false일 때
      if(!done) message = '완료';
      
      //단축 평가: done이 false라면 message에 '완료'를 할당
      message = done || '완료'
  • 객체를 가리키기를 기대하는 변수가 null또는 undefined가 아닌지 확인하고 프로퍼티를 참조할 때 단축평가 활용

    • 객체를 가리키기를 기대하는 변수의 값이 객체가 아니라 null 또는 undefined일 경우 객체의 프로퍼티를 참조하면 타입에러 발생, 이때 단축평가를 사용하면 에러를 발생시키지 않음
var elem = null
//elem이 null 이나 undefined와 같은 Falsy 값이면 elem 으로 평가되고
//elem이 Truthy 값이면 elem.value로 평가된다.
var value = elem && elem.value
  • 함수 매개변수에 기본값을 설정할 때 단축평가 활용
    • 함수를 호출할 때 인수를 전달하지 않으면 매개변수에 undefined가 할당됨. 이때 단축 평가를 사용해 매개변수의 기본값을 설정하면 undefined로 인해 발생할 수 있는 에러를 방지 가능
// 단축 평가를 사용한 매개변수의 기본값 설정
function getStringLength(str) f
    str = str || '';
    return str.length;

getStringLength(); // 0
getStringLength('hi'); //2

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

4.2 옵셔널 체이닝 연산자

  • 옵셔널 체이닝 연산자 ?.는 좌항의 피연산자가 null또는 undefined인 경우 undefined를 반환하고, 그렇지 않으면 우항의 프로퍼티 참조를 이어나감
  • 이는 객체를 가리키기를 기대하는 변수가 null또는 undefined가 아닌지 확인하고 프로퍼티를 참조할 때 유용
  • &&과 비교: &&는 Falsy 값이면 좌항 피연산자를 그대로 반환하나, 옵셔널 체이닝 연산자는 null, undefined인 경우만 좌항 피연산자를 반환

4.3 null 병합 연산자

  • null 병합 연산자 ??는 좌항의 피연산자가 null 또는 undefined인 경우 우항의 피연산자를 반환하고, 그렇지 않으면 좌항의 피연산자를 반환
  • 이는 변수에 기본 값을 설정할 때 유용
  • ||과 비교: ||는 Falsy 값이면 우항 피연산자를 그대로 반환하나, 옵셔널 체이닝 연산자는 null, undefined인 경우만 우항 피연산자를 반환
profile
소통하는 개발자가 꿈입니다!

0개의 댓글