JS의 모든 값은 타입이 있으며 개발자의 의도에 따라 다른 타입으로 변환될 수 있다.
var x = 10;
// 명시적 타입 변환
// 숫자를 문자열로 타입 캐스팅한다.
**var sre = x.tpString();**
console.log(typeof str, str); // string 10
// x 변수의 값이 변경된 것은 아니다.
console.log(typeof x, x); // number 10
개발자의 의도와는 상관없이 표현식을 평가하는 도중에 JS 엔진에 의해 암묵적으로 타입이 자동 변환되는 것은 암묵적 타입 변환 또는 타입 강제 변환이라고 한다.
var x = 10;
// 암묵적 타입 변환
// 문자열 연결 연산자는 숫자 타입 x의 값을 바탕으로 새로운 문자열을 생성한다.
var str = x + '';
console.log(typeof str, str); // string 10
// x 변수의 값이 변경된 것은 아니다/
console.log(typeof x, x); // number 10
암묵적 타입 변환은 기존 변수 값을 재할당하여 변경하는 것이 아니다.
암묵적 타입 변환은 개발자의 의도와 상관없이 일어날 수 있으므로 어디서 타입 변환이 일어나는지 코드를 예측할 수 있도록 주의해서 작성해야 한다.
JS 엔진은 표현식을 평가할 때 개발자의 의도와는 상관없이 코드의 문맥을 고려해 암묵적으로 데이터 타입을 강제 변환(암묵적 타입 변환)할 때가 있다.
// 피연산자가 모두 문자열 타입이어야 하는 문맥
'10' + 2 // '102
// 피연산자가 모두 숫자 타입이어야 하는 문맥
5 * '10' // 50
// 피연산자 또는 표현식이 불리언 타입이어야 하는 문맥
!0 // true
if(1) {}
// 피연산자 중 하나 이상이 문자열이므로 문자열 연결 연산자로 동작
1 + '2' // '12'
문자열 연결 연산자는 코드의 문맥상 모두 문자열 타입이어야 한다.
// ES6에서 도입된 템플릿 리터럴 표현식 삽입은 표현식의 평가 결과를 문자열 타입으로
// 암묵적 타입 변환한다.
`1 + 1 = ${1 + 1}` // "1 + 1 = 2"
JS 엔진이 문자열 타입이 아닌 값을 문자열 타입으로 암묵적 타입 변환을 수행할 때의 동작
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()) + '' // Uncaught 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' // 0
1 * '10' // 10
1 / 'one' // NaN