JavaScript에서 값은 여러 가지 타입일 수 있어요. 변수의 타입을 바꾸는 일은 명시적인 _타입 변환_으로 할 수 있어요. 그 외에도, JavaScript는 문맥이 요구하면 타입 강제 변환(암시적 타입 변환)도 수행해요.
JavaScript에는 다른 많은 언어처럼 (다른) 타입으로 캐스팅하는 구문이 없어요. 대신 몇 가지 내장 도우미를 사용할 수 있어요.
특히 Boolean, Number, String은 함수처럼 사용해서 값을 해당 타입으로 변환할 수 있어요.
Boolean(value)를 사용하면 어떤 값이든 불리언으로 변환할 수 있어요.
false로 변환되는 값, 이른바 falsy 값에는 정해진 집합이 있어요.
가장 중요한 falsy 값은 false, 0, 빈 문자열, null, undefined, NaN이에요.
그 밖의 모든 값에 대해서는 Boolean이 true를 반환해요.
이런 값을 _truthy_라고 해요.
Boolean(-1);
// => true
Boolean(0);
// => false
Boolean(' ');
// => true
Boolean('');
// => false
앞에서 설명한 규칙 때문에 JavaScript에서 '0', 'false', [], {}는 truthy예요.
Number(value)는 값을 숫자로 변환할 때 사용할 수 있어요.
문자열 앞뒤의 공백은 무시되고, 빈 문자열은 0으로 변환돼요.
원시 값이 아닌 값이나 숫자를 나타내지 않는 문자열을 변환하려고 하면 결과는 NaN(숫자가 아님)이에요.
Number(' -12.34 ');
// => -12.34
Number('1,2');
// => NaN
Number('');
// => 0
Number({ num: 123 });
// => NaN
String(value)를 사용하면 값을 문자열로 변환할 수 있어요.
원시 값에 대해서는 결과가 예상한 그대로예요.
String(12.34);
// => '12.34'
String(false);
// => 'false'
String(null);
// => 'null'
String(undefined);
// => 'undefined'
배열의 경우, String 함수는 각 원소에 문자열 변환을 적용하고 그 결과를 쉼표로 이어 붙여요.
구분자를 직접 바꾸고 싶다면 join 메서드를 직접 사용해도 돼요.
이 경우 null과 undefined는 빈 문자열로 변환된다는 점에 유의해요.
String([42, null, true, 'abc']);
// => '42,,true,abc'
객체의 경우, 기본적으로 String은 별로 도움이 안 되는 문자열을 반환해요.
String({ key: 'value' });
// => '[object Object]'
특정 문맥에서 JavaScript는 어떤 문을 평가하기 전에 값을 자동으로 다른 데이터 타입으로 변환해요. 이런 암시적 변환을 _타입 강제 변환_이라고 해요.
불리언 문맥에서 불리언이 아닌 값을 사용하면, JavaScript는 Boolean 함수와 같은 규칙을 적용해 그 값을 암시적으로 변환해요.
불리언으로의 강제 변환은 주로 다음과 같은 경우에 일어나요.
if문의 조건?의 첫 번째 피연산자!의 피연산자&&와 논리 OR 연산자 ||의 피연산자 (식의 결과는 피연산자 중 하나이며, 반드시 불리언인 것은 아니에요)const num = 0;
if (num) {
// this block is NOT executed because 0 is falsy
}
덧셈 연산자 +를 원시 값에 사용하는데 피연산자 하나가 문자열이면, 다른 피연산자도 문자열로 강제 변환돼요.
변환 방식은 String 함수를 사용할 때와 같아요.
그런 다음 두 문자열이 이어 붙여져요.
let name;
'hello ' + name;
// => 'hello undefined'
많은 연산자가 위에서 설명한 Number 함수의 방식에 따라 피연산자를 (필요하면) 숫자로 강제 변환해요.
+(문자열이 포함되지 않은 경우), -, *, /, %, **
+, -
>, >=, <, <=
|, &, ^, ~
이 연산자들 각각에 대한 자세한 내용은 MDN 연산자 목록을 참고해요.
실수를 피하려면 이런 연산자를 적용하기 전에 항상 Number를 명시적으로 호출하는 게 좋아요.
친구 Kojo는 숫자를 아주 좋아해요. 'fun-with-numbers'라는 작은 웹사이트도 하나 운영하고 있죠. 그런데 Kojo는 프로그래밍을 그다지 잘하지 못해서 여러분에게 도움을 청했어요.
여러분은 Kojo의 웹사이트에 들어갈 새로운 숫자 게임을 위해 도우미 함수 두 개를 만들고, 사용자가 입력할 수 있는 값을 검증하는 함수 하나를 더 만들 거예요.
Kojo의 웹사이트에 있는 게임 중 하나는 숫자가 적힌 바퀴 두 묶음을 보여 주는 슬롯머신처럼 생겼어요. 숫자 묶음 하나하나가 하나의 수를 나타내죠. 게임 규칙을 위해 Kojo는 이 두 수의 합을 알아야 해요.
두 개의 배열을 매개변수로 받는 twoSum 함수를 작성해요.
각 배열은 0과 9 사이의 숫자 하나 이상으로 이루어져 있어요.
함수는 각 배열을 하나의 수로 해석하고, 두 수의 합을 반환해야 해요.
twoSum([1, 2, 3], [0, 7]);
//=> 130
// [1, 2, 3] represents 123 and [0, 7] represents 7.
// 123 + 7 = 130
웹사이트의 또 다른 게임은 "Lucky Numbers"라는 작은 퀴즈예요. 사용자가 숫자를 입력하면 그 숫자가 어떤 비밀 수열이나 패턴에 속하는지 확인할 수 있죠. '행운의 숫자'의 수열이나 패턴은 매달 바뀌고, 사용자마다 그것을 맞힐 수 있는 기회가 제한되어 있어요.
이번 달의 행운의 숫자는 회문인 수예요. 회문은 숫자를 뒤집어도 같은 수를 말하죠.
숫자를 매개변수로 받는 새로운 luckyNumber 함수를 구현해요.
이 함수는 숫자가 회문이면 true를, 그렇지 않으면 false를 반환해야 해요.
입력으로 주어지는 숫자는 항상 양의 정수예요.
luckyNumber(1441);
//=> true
luckyNumber(123);
//=> false
웹사이트 여러 곳에는 사용자가 숫자를 입력하고 버튼을 클릭해 어떤 동작을 실행할 수 있는 입력 필드가 있어요. Kojo는 사이트의 사용자 경험을 개선하고 싶어 해요. 사용자가 버튼을 클릭했는데 입력 필드에 잘못된 값이 들어 있으면 오류 메시지를 보여 주려고 하죠.
입력 필드의 값이 어떻게 전달되는지에 대해 좀 더 알아볼까요.
undefined이거나 null일 수 있어요.사용자 입력을 매개변수로 받는 errorMessage 함수를 작성해요.
사용자가 아무것도 입력하지 않았다면 errorMessage는 'Required field'를 반환해야 해요.
입력이 (JavaScript 변환 규칙에 따라) 0이 아닌 수를 나타내지 않으면 'Must be a number besides 0'를 반환해야 하죠.
그 외의 모든 경우에는 입력이 유효하다고 가정할 수 있으며, 반환 값은 빈 문자열이어야 해요.
errorMessage('123');
// => ''
errorMessage('');
// => 'Required field'
errorMessage('abc');
// => 'Must be a number besides 0'
Exercism에 가입하고 JavaScript 트랙을 개념 37개연습 문제 159개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.