1. 타입 변환이란?
자바스크립트 의 모든 값 은 타입이 있다. 값의 타입 은 개발자의 의도에 따라 다른 타입으로 변환 할 수 있다.의도적 으로 값의 타입을 변환 하는 것을 명시적 타입 변환 또는 타입 캐스팅 이라 한다.
const x = 10;
const str = x + '';
console.log(typeof str, str); // string 10
console.log(typeof x, x); // number 10
위의 예제를 보면 x 는 number 타입이면서 10 인 변수다.
하지만, str 변수로 할당될 때 연산된 + 를 덧셈 연산자 가 아닌 문자열 연결 연산자 로 연산이 되었다.x 와 더해진 값이 '' 인 빈 문자열 이기 때문에 암묵적으로 타입을 변환 한 것이다.
2. 암묵적 타입 변환
자바스크립트 엔진은 표현식 을 평가 할 때 개발자의 의도와는 상관없이 코드의 문맥 을 고려해서 암묵적으로 데이터 타입 을 강제 변환 할 때가 있다.
// 피연산자가 모두 문자열 타입어야하는 문맥인 경우
'10' + 2 // '102'
// 피연산자가 모두 숫자 타입이어야 하는 문맥인 경우
5 * '10' // 50
// 피연산자 또는 표현식이 불리언 타입이어야 하는 문맥인 경우
!0 // true
if(1){ }
1) 문자열 타입으로 변환
자바스크립트 엔진은 문자열 연결 연산자 표현식을 평가하기 위해 문자열 연결 연산자의 피연산자 중에서 문자열 타입이 아닌 피연산자 를 문자열 타입 으로 암묵적 타입 변환 한다.
1 + '2' // '12'
ES6 에서 도입된 템플릿 리터럴 의 표현식은 평가 결과 를 암묵적으로 변환한다.
`1 + 1 = ${1+1}` // '1 + 1 = 2'
2. 숫자 타입으로 변환
자바스크립트 엔진은 산술 연산자 표현식을 평가하기 위해 산술 연산자 표현식을 평가하기 위해 산술 연산자의 피연산자 중 숫자 타입이 아닌 피연산자 를 숫자 타입 으로 암묵적으로 변환 한다. 이때 피연산자 를 숫자 타입으로 변환할 수 없는 경우 는 산술 연산을 수행할 수 없으므로 표현식의 평가 결과는 NaN (Not a Number) 이 된다.
1 - '1' // 0
1 * '10' // 10
1 / 'one' // NaN
13 % '5' // 3
또한 비교 연산자 또한 숫자 타입으로 변환 된다.
'1' > 0 // true
'0' >= 0 // true
+ 단항 연산자를 문자열 앞 에 사용하면 숫자 타입 으로 값을 변환 한다.
이를 통해서 명시적 타입 변환 을 표현 하는 경우가 존재한다.
// 문자열 타입
+'' // 0
+'0' // 0
+'1' // 1
+'string' // NaN
// 불리언 타입
+true // 1
+false // 0
// null 타입
+null // 0
// undefined 타입
+undefined // NaN
// 심벌 타입
+Symbol() // TypeError: Cannot convert a Symbol value to a number
// 객체 타입
+{} // NaN
+[] // 0
+[10, 20] // NaN
+(function(){})// NaN
3. 불리언 타입으로 변환
if 문 의 조건식은 boolean 타입으로 암묵적 타입 변환을 한다.
if(''){ } // false
if(true){ } // true
if(0){ } // false
if('str'){ } // true
if(null){ } // false
추가적으로 자바스크립트 엔진은 boolean 타입을 참으로 평가 되는 Truthy 와 거짓으로 평가 되는 Falsy 로 값을 구분한다.
Falsy 값
-false
-undefined
-null
-0
--0
-NaN
-''(빈 문자열)
Truthy 값
Falsy 값 이외의 모든 값은 True 로 평가되는 Truthy 값이다.
Boolean 생성자 함수 를 new 연산자 없이 호출하는 방법으로 타입을 변환할 수 있다.
Boolean('str') // true
Boolean(0) // false
Boolean(false) // false
Boolean(NaN) // false
! 부정 논리 연산자 를 두 번 사용하는 방법 으로 타입 변환을 할 수 있다.
이를 통해서 명시적 으로 타입 변환을 표현하는 방법이지만, Boolean 생성자 함수 를 사용하여 표현하는 방법이 직관적이기 때문에 해당 방법을 권장한다.
!!0 // false
!!1 // true
!!NaN // false
!!'str' // true
4. 단축 평가
1. 논리 연산자를 사용한 단축 평가
#1. 논리합 연산자
논리합 연산자 || 는 피연산자 의 값 중 Truthy 한 값을 반환하는 연산자이다.Truthy 값이 존재하지 않는 경우 마지막 피연산자 의 값을 반환 한다.
0 || null || 1 // 1
1 || 2 || 3 // 1
0 || null || NaN // NaN
#2. 논리곱 연산자
논리곱 연산자 && 는 피연산자 가 모두 Truthy 한 값인 경우 마지막 Truthy 값을 반환하는 연산자이다.Truthy 값이 존재하지 않는 경우 첫번째 피연산자 의 값을 반환 한다.
`Cat` && `Dog` // `Dog`
1 === 1 && 'a' === 'a' // true
0 && 1 // 0
어떤 조건이 Truthy 한 값인 경우 논리곱 연산자 && 로 if 문 을 대체할 수 있다.
const done = true;
let message = '';
if(done) message = '완료';
message = done && '완료';
단, 위의 경우 변수 done 이 false 인 경우 변수 message 에는 false 가 할당되게 된다.
이때 유효한 방법이 논리합 연산자 || 를 사용하는 것이다.
const done = false;
let message = '';
if(!done) message = '미완료';
message = done || '완료';
위의 두 방법을 응용해서 사용하면 다음과 같다.
const done = true;
let message = '';
message = done && '완료' || '미완료';
변수 done 이 true 일 경우 완료 가 할당되고, false 일 경우에는 앞의 논리곱 연산은 false 가 되므로 미완료 가 할당된다.
2. 옵셔널 체이닝 연산자
ES11 에서 도입된 옵셔널 체이닝 연산자 ?. 는 좌항의 피연산자 가 null 또는 undefined 인 경우 undefined 를 반환하고, 그렇지 않으면 우항 의 프로퍼티 참조 를 이어간다.
const elem = null;
const value = elem?.value;
console.log(value); // undefined
4. null 병합 연산자
ES11 에서 도입된 null 병합 연산자 ?? 는 좌항의 피연산자 가 null 또는 undefined 인 경우 우항의 피연산자 를 반환하고, 그렇지 않으면 좌항의 피연산자 를 반환한다. null 병합 연산자 ??는 변수에 기본값을 설정할 때 유용 하다.
const foo = null ?? 'default string';
console.log(foo); // "default string"
'프론트엔드 > 자바스크립트 딥다이브' 카테고리의 다른 글
| 자바스크립트 딥다이브 - 10장 (0) | 2023.02.03 |
|---|---|
| 자바스크립트 딥다이브 - 8장 제어문 (0) | 2023.01.30 |
| 자바스크립트 딥다이브 - 7장 연산자 (0) | 2023.01.27 |