[모던자바스크립트] 9.타입 변환과 단축 평가
1. 타입 변환이란?
- 명시적타입변환 / 타입캐스팅 : 개발자가 의도적으로 값의 타입을 변환하는 것
- 암묵적타입변환 / 타입강제변환 : 자바스크립트 엔진에 의해 암묵적으로 타입이 자동 변환
암묵적 타입 변환은 기존 변수 값을 재할당 하여 변경하는 것이 아니라 새로운 타입의 값을 만들어 단 한 번 사용하고 버린다.
2. 암묵적 타입 변환
2-1. 문자열 타입으로 변환
1 + "2" // -> "12"
2-2. 숫자 타입으로 변환
산술연산자 및 비교연산자 일때 숫자타입이 아닌 피연산자를 숫자 타입으로 암묵적 타입 변환한다.
1 - '1' // -> 0
1 * '10' // -> 10
1 / 'one' // -> NaN
'1' > 0 // -> true
- 0 : 빈문자열(""), 빈배열([]), false
- 1 : true
- NaN : 객체, 빈배열이 아닌 배열, undefined
2-3. 불리언 타입으로 변환
자바스크립트 엔진은 불리언 타입이 아닌 값을 Truthy 값 또는 Falsy값으로 구분한다.
Truthy값 또는 Falsy 값 앞에 !를 붙여주면 각각 true와 false로 전달된다.
3.명시적 타입 변환
개발자 의도에 따라 명시적으로 타입을 변경하는 방법
- 표준 빌트인 생성자 함수를 new 연산자 없이 호출하는 방법(String(), Number(), Boolean())
- 빌트인 메서드를 사용하는 방법
- 암묵적 타입 변환을 이용하는 방법
3-1. 문자열 타입으로 변환
- String 생성자 함수를 new 연산자 없이 호출하는 방법
- Object.prototype.toString 메서드를 사용하는 방법
- 문자열 연결 연산자를 이용하는 방법
// 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"
3-2. 숫자 타입으로 변환
- Number 생성자 함수를 new 연산자 없이 호출하는 방법
- parseInt, parseFloat 함수를 사용하는 방법(문자열만 숫자타입으로 변환 가능)
- + 단항 산술 연산자를 이용하는 방법
- * 산술연산자를 이용하는 방법
// 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
// 3. + 단항 산술 연산자를 이용하는 방법
// 문자열 타입 => 숫자 타입
+'0'; // -> 0
+'-1'; // -> -1
+'10.53'; // -> 10.53
// 불리언 타입 => 숫자 타입
+true; // -> 1
+false; // -> 0
// 4. * 산술 연산자를 이용하는 방법
// 문자열 타입 => 숫자 타입
'0' * 1; // -> 0
'-1' * 1; // -> -1
'10.53' * 1; // -> 10.53
// 불리언 타입 => 숫자 타입
true * 1; // -> 1
false * 1; // -> 0
3-3. 불리언 타입으로 변환
- Boolean 생성자 함수를 new 연산자 없이 호출하는 방법
- ! 부정 논리 연산자를 두번 사용하는 방법
// 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
4.단축 평가
4-1.논리 연산자를 사용한 단축 평가
논리합(||) 연산자와 논리곱(&&)연산자는 논리 연산의 결과를 결정하는 피연산자를 타입 변환하지 않고 그대로 반환한다.
단축 평가는 표현식을 평가하는 도중에 평가 결과가 확정된 경우 나머지 평가 과정을 생략하는 것을 말한다.
▪️ 논리곱(&&)
두 개의 피연산자가 모두 true로 평가될때 true를 반환한다.
"Cat" && "Dog" //----> "Dog"
▪️논리합( || )
두 개의 피연산자 중 하나만 true로 평가 되어도 true를 반환한다.
"Cat" || "Dog" // --> "Cat"
✅ 객체 가리키기를 기대하는 변수가 null 또는 undefined가 아닌지 확인하고 프로퍼티를 참조할 때
var elem = null;
var value = elem.value; // TypeError: Cannot read property 'value' of null
//단축 평가 사용시 에러 방지
var elem = null;
var value = elem && elem.value // -> null
4-2. 옵셔널 체이닝 연산자
좌항의 피연산자가 null 또는 undefined인 경우 undefined를 반환하고, 그렇지 않으면 우항의 프로퍼티 참조를 이어나간다.
var value = elem?.value // -> undefined
좌항의 피연산자가 false로 평가되는 Falsy값 이라도 null 또는 undefined가 아니면 우항의 프로퍼티 참조를 이어간다.
4-3. null 병합 연산자
ES11에 도입됐다. ??는 좌항의 피연산자가 null 또는 undefined인 경우 우항의 피연산자를 반환하고, 그렇지 않으면 좌항의 피연산자를 반환한다. null 병합 연산자 ??는 변수에 기본값을 설정할 때 유용하다.
var foo = null ?? 'default string';
console.log(foo); // "default string"