자바스크립트의 모든 값은 타입이 있다. 값의 타입은 개발자의 의도에 따라 다른 타입으로 변환할 수 있다.
개발자가 의도적으로 값의 타입을 변환하는 것을 명시적 타입 변환 또는 타입 캐스팅이라 한다.
let x = 10;
// 명시적 타입 변환
let str = x.toString();
console.log(typeof str, str); // string 10
// 변수 x의 값이 변경된 것은 아니다.
console.log(typeof x, x); // number 10
let x = 10;
// 암묵적 타입 변환
// 문자열 연결 연산자는 숫자 타입 x의 값을 바탕으로 새로운 문자열을 생성한다.
let str = x + '';
console.log(typeof str, str); // string 10
// 변수 x의 값이 변경된 것은 아니다.
console.log(typeof x, x); // number 10
자바스크립트는 특정 타입의 값을 기대하는 곳에 다른 타입의 값이 오면, 자동으로 타입을 변환하여 사용한다. 즉, 문자열 값이 오길 기대하는 곳에 숫자가 오더라도 자바스크립트는 알아서 숫자를 문자열로 변환하여 사용한다.
암묵적 타입 변환이 발생하면 문자열, 숫자 불리언과 같은 원시 타입 중 하나로 타입을 자동 변환한다.
// 피연산자가 모두 문자열 타입이어야 하는 문맥
'10' + 2 // '102'
// 피연산자가 모두 숫자 타입이어야 하는 문맥
5 + '10' // 50
// 피연산자 또는 표현식이 불리언 타입이어야 하는 문맥
!0 // true
if (1) { }
+
연산자는 피연산자 중 하나 이상이 문자열일 경우 문자열 연산자로 동작한다.// 숫자 타입
0 + '' // '0'
-0 + '' // '0'
1 + '' // '1'
-1 + '' // '-1'
NaN + '' // 'NaN'
Infinity + '' // 'Infinity'
-Infinity + '' // '-Infinity'
// 불리언 타입
true + '' // 'true'
false + '' // 'false'
// null 타입
null + '' // 'null'
// undefined 타입
undefined + '' // 'undefined'
// 심벌 타입
(Symbol()) + '' // TypeError: Cannot convert a Symbol value to a string
// 객체 타입
({}) + '' // '[object Object]'
Math + '' // '[object Math]'
[] + '' // ''
[10, 20] + '' // '10, 20'
(function(){}) + '' // 'function(){}'
Array + '' // 'function Array() { [native code] }'
// 템플릿 리터럴
'1 + 1 = ${1 + 1}' // '1 + 1 = 2'
NaN
이 된다.1 - '1' // 0
1 * '10' // 10
1 / 'one' // NaN
'1' > 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
true
로, Falsy 값은 false
로 암묵적 타입 변환한다.// 전달받은 인수가 Falsy 값이면 true, Truthy 값이면 false를 반환한다.
function isFalsy(value) {
return !value;
}
// 전달받은 인수가 Truthy 값이면 true, Falsy 값이면 false를 반환한다.
function isFalsy(value) {
return !!value;
}
// 모두 true를 반환한다.
isFalsy(false);
isFalsy(undefined);
isFalsy(null);
isFalsy(0);
isFalsy(NaN);
isFalsy('');
isTruthy(true);
isTruthy('0'); // 빈 문자열이 아닌 문자열은 Truthy 값이다.
isTruthy({});
isTruthy([]);
명시적 타입 변환이란 개발자가 의도적으로 타입 변환을 하는 것을 말한다.
표준 빌트인 생성자 함수(String, Number, Boolean)를 new 연산자 없이 호출하는 방법과 내장 메서드를 사용하는 방법, 암묵적 타입 변환을 이용하는 방법이 있다.
String
생성자 함수를 new 연산자 없이 호출하여 문자열 타입으로 변환할 수 있다.// 숫자 타입에서 문자열 타입으로 변환
String(1); // '1'
String(NaN); // 'NaN'
String(Infinity); // 'Infinity'
// 불리언 타입에서 문자열 타입으로 변환
String(true); // 'true'
String(false); // 'false'
toString
메서드를 사용하여 문자열 타입으로 변환할 수 있다.// 숫자 타입에서 문자열 타입으로 변환
(1).toString(); // '1'
(NaN).toString(); // 'NaN'
(Infinity).toString(); // 'Infinity'
// 불리언 타입에서 문자열 타입으로 변환
(true).toString(); // 'true'
(false).toString(); // 'false'
+
)를 사용하여 문자열 타입으로 변환할 수 있다.// 숫자 타입에서 문자열 타입으로 변환
1 + ''; // '1'
NaN + ''; // 'NaN'
Infinity + ''; // 'Infinity'
// 불리언 타입에서 문자열 타입으로 변환
true + ''; // 'true'
false + ''; // 'false'
Number
생성자 함수를 new 연산자 없이 호출하여 숫자 타입으로 변환할 수 있다.// 문자열 타입에서 숫자 타입으로 변환
Number('0'); // 0
Number('-1'); // -1
Number('10.53'); // 10.53
// 불리언 타입에서 숫자 타입으로 변환
Number('0'); // 0
Number('-1'); // -1
Number('10.53'); // 10.53
parseInt()
, parseFloat()
함수를 사용하여 숫자 타입으로 변환할 수 있다. 단, 문자열만 변환 가능하다.// 문자열 타입에서 숫자 타입으로 변환
parseInt('0'); // 0
parseInt('-1'); // -1
parseInt('10.53'); // 10.53
+
단항 산술 연산자와, +
산술 연산자를 사용하여 숫자 타입으로 변환할 수 있다.// + 단항 산술 연산자를 사용하는 방법
// 문자열 타입에서 숫자 타입으로 변경
+'0'; // 0
+'-1'; // -1
+'10.53'; // 10.53
// 불리언 타입에서 숫자 타입으로 변경
+true; // 1
+false; // 0
*
산술 연산자를 사용하여 숫자 타입으로 변환할 수 있다.// 문자열 타입에서 숫자 타입으로 변경
'0' * 1; // 0
'-1' * 1; // -1
'10.53' * 1; // 10.53
// 불리언 타입에서 숫자 타입으로 변경
true * 1; // 1
false * 1; // 0
// 문자열 타입에서 불리언 타입으로 변경
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
!
부정 논리 연산자를 두 번 사용하여 불리언 타입으로 변환할 수 있다.// 문자열 타입에서 불리언 타입으로 변경
!!'x'; // true
!!''; // false
!!'false'; // true
// 숫자 타입에서 불리언 타입으로 변경
!!0; // false
!!1; // true
!!NaN; // false
!!Infinity; // true
// null 타입에서 불리언 타입으로 변경
!!null; // false
// undefined 타입에서 불리언 타입으로 변경
!!undefined; // false
// 객체 타입에서 불리언 타입으로 변경
!!{}; // true
!![]; // true