자바스크립트의 모든 값은 타입이 있다.
개발자가 의도적으로 값의 타입을 변환하는 것을 명시적 타입 변환 또는 타입 캐스팅이라 한다.
개발자의 의도와 상관없이 표현식을 평가하는 도중에 자바스크립트 엔진에 의해 암묵적으로 타입이 자동 변환되기도 하는데, 이를 암묵적 타입 변환 또는 타입 강제 변환이라 한다.
명시적 또는 암묵적 타입 변환이 기존 원시 값을 직접 변경하는 것은 아니다.
타입 변환이란 기존 원시 값을 사용해 다른 타입의 새로운 원시 값을 생성하는 것이다.
<aside> <img src="/icons/chat_gray.svg" alt="/icons/chat_gray.svg" width="40px" /> 자바스크립트 엔진은 표현식을 에러 없이 평가하기 위해 피연산자의 값을 암묵적 타입 변환해 새로운 타입의 값을 만들어 단 한 번 사용하고 버린다.
</aside>
암묵적 타입 변환은 명시적 타입 변환과는 다르게 타입을 변경하겠다는 개발자의 의지가 코드에 명백히 드러난다. 따라서 암묵적 타입 변환이 발생하는지, 발생한다면 어떤 타입의 어떤 값으로 변환되는지, 그리고 타입 변환된 값으로 표현식이 어떻게 평가될 것인지 예측 가능해야 한다.
<aside> <img src="/icons/chat_gray.svg" alt="/icons/chat_gray.svg" width="40px" /> 명시적 타입 변환만 사용하고 암묵적 타입 변환은 발생하지 않도록 코드를 작성하는 행위는 옳지 않다. 때로는 명시적 타입 변환보다 암묵적 타입 변환이 가독성 측면에서 더 좋을 수 있기 때문이다.
</aside>
표현식을 평가할 때 코드의 문맥에 부합하지 않는 다양한 상황이 발생할 때, 자바스크립트는 가급적 에러를 발생시키지 않도록 암묵적 타입 변환을 통해 표현식을 평가한다.
암묵적 타입 변환이 발생하면 문자열, 숫자, boolean과 같은 원시 타입 중 하나로 타입을 자동 변환한다.
문자열 연결 연산자의 모든 피연산자는 코드의 문맥상 모두 문자열 타입이어야 한다.
(주의)
/* 심벌 타입 */
(Symbol()) + '' // -> TypeError
/* 객체 타입 */
({}) + '' // -> "[object Object]"
Math + '' // -> "[object Math]"
[] + '' // -> ""
[a,b] + '' // -> "a,b"
(function(){}) + '' // -> "function(){}"
Array + '' // -> "function Array() { [native code] }
산술 연산자의 모든 피연산자는 코드의 문맥상 모두 숫자 타입이어야 한다.
피연산자를 숫자 타입으로 변환할 수 없는 경우는 산술 연산을 수행할 수 없으므로 NaN으로 평가한다.
비교 연산자는 피연산자의 크기를 비교하므로 모든 피연산자는 코드의 문맥상 모두 숫자 타입이어야 한다.
+단항 연산자는 숫자 타입의 값이 아닌 피연산자를 숫자 타입의 값으로 암묵적 타입 변환을 수행한다.
(주의)
+'' // -> 0
+null // -> 0
+undefined // -> NaN
+Symbol() // -> TypeError
+{} // -> NaN
+[] // -> 0
+[a,b] // -> NaN
+(function(){}) // -> NaN
자바스크립트 엔진은 boolean 타입이 아닌 값을 Truthy 값 또는 Falsy 값으로 구분한다.
제어문 또는 삼항 조건 연산자의 조건식과 같이 boolean 값으로 평가되어야 할 문맥에서 Truthy 값은 true, Falsy 값은 false로 암묵적 타입 변환된다.
Falsy 값 외의 모든 값은 모두 true로 평가되는 Truthy 값이다.
/* Falsy 값을 판별하는 함수 */
function isFalsy(v) {
return !v;
}
/* Truthy 값을 판별하는 함수 */
function isTruthy(v) {
return !!v;
}
개발자의 의도에 따라 명시적으로 타입을 변경하는 방법은 아래와 같다.
<aside> <img src="/icons/chat_gray.svg" alt="/icons/chat_gray.svg" width="40px" /> 표준 빌트인 생성자 함수와 표준 빌트인 메서드는 자바스크립트에서 기본 제공하는 함수이다. 표준 빌트인 생성자 함수는 객체를 생성하기 위한 함수이며, 표준 빌트인 메서드는 자바스크립트에서 기본 제공하는 빌트인 객체의 메서드이다.
</aside>
문자열 타입이 아닌 값을 문자열 타입으로 변환하는 방법은 아래와 같다.