자바스크립트에서 **타입 변환(type conversion, type coercion)**은 기존의 원시 값으로 다른 원시 값을 생성하는 것이다. 두 가지 타입의 형 변환이 있다.
- 묵시적 형변환(implicit conversion)
- 명시적 형변환(explicit conversion)
- 묵시적 형변환은 자바스크립트 엔진에 의해서 암묵적으로 이루어진다.
- 연산자 표현식에서 연산자가 특정 타입이어야하는 경우
- 표현식이 특정 타입으로 평가되어야 하는 경우
- 함수에 파라미터에 지정된 타입과 다른 타입의 인자를 전달하는 경우
- 산술 연산에서 두 피연산자는
number
로 변환이 이루어진다.
"10" - 2; // 8
"10" / "2"; // 5
"10" / 2; // 5
"10" * 2; // 20
"2" ** 2; // 4
"10" % 3; // 1
- 단, 더하기 연산
+
는 피연산자에string
타입이 있다면 문자열 연결 연산을 수행한다.
"10" + 2; // 102
"10" + "2"; // 102
- 일치, 비교 연산을 제외한 모든 비교 연산에서 두 피연산자는
number
로 변환이 이루어진다.
'1' > 0; // true
- 단, 피연산자가 모두
string
인 경우 문자열 비교 연산을 한다.
'a' > 'b'; // false
문자열 연산자 참고
if
문이나for
문과 같은 제어문과 삼항 조건 연산자의 조건식은boolean
값으로 평가되어야 한다.
if (1) console.log('1');
Fasly값은 false
로, Truthy값은 true
로 변환된다.
- 부정 논리 연산자
!
을 두 번 사용하면 피연산자를boolean
값으로 평가한 결과를 얻을 수 있다.
!![]; // true
- 자바스크립트 엔진은
boolean
타입이 아닌 값을 Truthy(참으로 평가되는 값)과 Falsy(거짓으로 평가되는 값)으로 구분한다. - Falsy가 아닌 값은 모두 Truthy이다.
- 불리언 문맥에서 Truthy는
true
로, Falsy는false
로 변환된다.
type | value |
---|---|
boolean |
false |
number |
0 , -0 , NaN |
bigint |
0n |
string |
"" , '' , `` |
undefined |
undefined |
null |
null |
- Falsy인지 Truthy인지 판별하는
isFalsy
와isTruthy
를 작성해볼 수 있다.
const isFalsy = (val) => !val;
const isTruthy = (val) => !!val;
- 명시적 형변환(explicit coercion) 혹은 타입 캐스팅(type casting)은 프로그래머가 명시적으로 형변환하는 것을 의미한다.
- 명시적 형변환을 하는 방법은 아래와 같다.
- 빌트인 메서드 사용하기
- 빌트인 생성자 함수를
new
연산자 없이 사용하기
메서드 | 파라미터 | 반환 | 설명 |
---|---|---|---|
Number() |
타입 제한 없음 | number |
파라미터를 숫자로 바꿀 수 없는 경우 NaN 을, 그렇지 않다면 그 수를 반환한다. |
parseInt(문자열, base) |
string |
number |
문자열을 특정 진수를 사용한 정수로 반환한다. 변환할 수 없는 경우 NaN 을 반환한다. |
parseFloat(문자열) |
string |
number |
문자열을 부동소수점 실수로 반환한다. 변환할 수 없는 경우 NaN 을 반환한다. |
Number()
는 매개변수를 타입에 따라 다음과 같이 변환한다.
- Falsy는 다음과 같이 변환된다.
Falsy | converted to |
---|---|
undefined , NaN |
NaN |
그 외 | 0 |
- Truthy는 다음과 같이 변환된다.
분류 | converted to |
---|---|
string |
number 로 변환할 수 있는 경우 그 수를 반환한다.number 로 변환할 수 없는 경우 NaN 을 반환한다. |
배열 리터럴 | 요소가 없는 경우([] ), 0 을 반환한다.요소가 하나이고, 해당 요소가 number 로 변환가능하다면 그 수를 반환한다.요소가 두 개 이상인 경우 NaN 을 반환한다. |
객체 리터럴 | NaN |
function |
NaN |
메서드 | 파라미터 | 반환 | 설명 |
---|---|---|---|
String() |
타입 제한 없음 | string |
파라미터를 문자열로 바꾸어 반환한다. |
Object.prototype.toString() |
타입 제한 없음 | string |
파라미터를 문자열로 바꾸어 반환한다. |
- 대개 리터럴에 그대로
""
가 씌어진string
이 반환된다. - 예외는 아래와 같다.
리터럴 | converted to |
---|---|
배열 | 요소가 없다면([] ), "" 을 반환한다.요소가 하나라면, 그 요소가 그대로 string 으로 변환된다.요소가 두 개 이상이면, 요소들이 , 로 연결된 string 이 반환된다. |
{} |
"[object Object]" |
/* 리터럴이 그대로 반영된 경우 */
String(function(){}); // "function(){}"
String(true); // "true"
/* 배열의 경우 */
String([10]); // "10"
String(["10"]); // "10"
String([10, 20]); // "10,20"
String(["10", "20"]); // "10,20"
String(["A", 10])
Conversion Object to Primitive Value 참고
- 모던 자바스크립트 Deep Dive - 9장 타입 변환과 단축 평가
- The Modern JavaScript Tutorial - Type Conversions