모던 자바스크립트 Deep Dive - 09장 타입 변환과 단축 평가

송히·2023년 10월 8일
0
post-thumbnail

09. 타입 변환과 단축 평가

명시적 타입 변환(explicit coercion) / 타입 캐스팅(type casting): 개발자가 의도적으로 값의 타입을 변환하는 것
암묵적 타입 변환(implicit coercion) / 타입 강제 변환(type coercion): 개발자의 의도와는 상관없이 자바스크립트 엔진에 의해 암묵적으로 타입이 자동 변환 되는 것

  • 명시적 타입 변환 / 암묵적 타입 변환이 기존 원시 값을 직접 변경하지는 X -> 다른 타입의 새로운 원시 값을 생성하는 것
  • 암묵적 타입 변환은 기존 변수 값을 재할당하여 변경하는 것 X -> 한번 사용하고 버림
  • 명시적 / 암묵적 중 뭐가 더 낫다고 말할 수 없음 -> 중요한 것은 코드를 예측할 수 잇는 것

9.2 암묵적 타입 변환

자바스크립트 엔진이 표현식을 평가할 때, 개발자의 의도와는 상관없이 코드의 문맥을 고려해 암묵적으로 데이터 타입을 강제 변환함
-> 문자열 , 숫자 , 불리언과 같은 원시 타입 중 하나로 타입을 자동 변환

9.2.1 문자열 타입으로 변환

1 + '2' // '12'

문자열 연결 연산자의 피연산자 중,
문자열 타입이 아닌 피연산자 -> 문자열 타입으로 암묵적 타입 변환

9.2.2 숫자 타입으로 변환

// 산술연산자
1 - '1 ' // 0 
1 * '10' / 10 
1 / 'one' // NaN

// 비교연산자
'1' > 0 // true
  • 산술 연산자의 피연산자 중에서 숫자 타입이 아닌 피연산자를 숫자 타입으로 암묵적 타입 변환 -> 피연산자를 숫자 타입으로 변환할 수 없는 경우는 결과가 NaN
  • 비교 연산자의 피연산자 중에서 숫자 타입이 아닌 피연산자를 숫자 타입으로 암묵적 타입 변환

빈 문자열(''), 빈 배열([]), null, false => 0
true => 1
객체와 빈 배열이 아닌 배열, undefined => NaN
으로 변환됨

9.2.3 불리언 타입으로 변환

조건식의 평가 결과를 불리언 타입으로 암묵적 타입 변환
-> 자바스크립트 엔진은 불리언 타입이 아닌 값을 Truthy 값(참으로 평가되는 값) / Falsy 값(거짓으로 평가되는 값)으로 구분

Falsy 값 종류(7개):
false, undefined, null, 0, -0, NaN, ""(빈 문자열)

9.3 명시적 타입 변환

개발자의 의도에 따라 명시적으로 타입을 변경:
1. 표준 빌트인 생성자 함수(String, Number, Boolean)를 new 연산자 없이 호출
2. 빌트인 메서드를 사용
3. 암묵적 타입 변환을 이용

9.3.1 문자열 타입으로 변환

문자열 타입이 아닌 값을 문자열 타입으로 변환하는 방법 3가지

  1. String 생성자를 함수를 new 연산자 없이 호출하는 방법
String(1); // "1"
String(true); // "true"
  1. Object.prototype.toString 메서드를 사용하는 방법
(1).toString(); // "1"
(true).toStringO; // "true"
  1. 문자열 연결 연산자를 이용하는 방법
1 + ''; // "1"
true + " ; // "true"

9.3.2 숫자 타입으로 변환

숫자 타입이 아닌 값을 숫자 타입으로 변환하는 방법 4가지

  1. Number 생성자 함수를 new 연산자 없이 호출하는 방법
Number('-1'); // -1
Number(true); // 1
  1. parseInt, parseFloat 함수를 사용하는 방법(문자열만 변환 가능)
parseInt('-1'); // -1
    • 단항 산술 연산자를 이용하는 방법
+ '-1'; // -1
+ true; // 1
    • 산술 연산자를 이용하는 방법
'1'* -1; // -1
true * 1; // 1

9.3.3 불리언 타입으로 변환

불리언 타입이 아닌 값을 불리언 타입으로 변환하는 방법 2가지

  1. Boolean 생성자 함수를 new 연산자 없이 호출하는 방법
Boolean('x'); // true
Boolean(1); // true
Boolean(null); // false
Boolean({}); // true, 객체타입
  1. ! 부정 논리 연산자를 두 번 사용하는 방법
!!'x'; // true
!!1; // true
!!null; // false
!![]; // true

9.4 단축 평가

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

단축평가: 논리 연산의 결과를 결정하는 피연산자를 타입 변환하지
않고 그대로 반환
-> 표현식을 평가하는 도중에 평가 결과가 확정되면 나머지 평가 과정을 생략

  • 논리합(||) 연산자: 둘 중 하나만 true여도 true
'Cat' || 'Dog' // "Cat" 
false || 'Dog' // "Dog" 
'Cat' || false // "Cat" 
  • 논리곱(&&) 연산자: 둘 다 true여야 true -> 아님 false
'Cat' && 'Dog' // "Dog" 
false && 'Dog' // false 
'Cat' && false // false 
  • 단축 평가를 유용하게 사용하는 상황
  1. 객체를 가리키기를 기대하는 변수가 null 또는 undefined인지 확인하고 프로퍼티를 참조할 때
    -> null 또는 undefined이면 에러발생되며 강제 종료됨
var elem = null;
var value = elem && elem.value
  1. 함수 매개변수에 기본값을 설정할 때
    인수를 전달하지 않으면 매개변수에는 undefined가 할당됨
    -> 단축 평가로 기본값 설정해 에러 방지
function getStrLen(str) {
	str = str || '';
    return str.length;
}

9.4.2 옵셔널 체이닝 연산자

옵셔널 체이닝 연산자: ES11에서 도입됨, ?.

  • 객체의 속성에 접근하거나 메서드를 호출할 때 좌항의 피연산자가 null 또는 undefined인 경우 undefined를 반환, 아니면 우항의 프로퍼티 참조
  • 이전에는 논리 연산자 &&를 사용한 단축 평가 사용했음
  • &&는 Falsy값이면 좌항 피연산자 그대로 반환
    <-> 옵셔널 체이닝 연산자는 좌항 피연산자가 Falsy 값이어도 null / undefined가 아니면 우항의 프로퍼티를 참조
var elem = null;

var value = elem?.value;
console.log(value); // undefined

9.4.3 null 병합 연산자

null 병합 연산자: ES11에서 도입됨, ??

  • 좌항의 피연산자가 null / undefined인 경우 undefined를 우항의 피연산자를 반환, 아니면 좌항의 피연산자 반환
  • 변수에 기본값을 설정할 때 유용
  • 이전에는 논리 연산자(||) 사용한 단축 평가 썼음
  • ||는 Falsy값이면 우항의 피연산자 반환
    <-> null 병합 연산자는 좌항 피연산자가 Falsy 값이어도 null / undefined가 아니면 좌항의 피연산자를 그대로 반환
var foo = null ?? 'default';
console.log(foo); // 'default'
profile
데브코스 프론트엔드 5기

0개의 댓글