- 명시적 타입 변환 (타입 캐스팅 ) : 의도적으로 값의 타입 변환
- 암묵적 타입 변환 (타입 강제 변환) : 의도와 무관하게 표현식 평가 중 JS 엔진에 의해 암묵적으로 타입이 자동 변환
: 둘 다 기존 원시 값을 직접 변경하는 것은 아니다
원시 값은 변경 불가능한 값 (immutable value)
명시적
var x =10; //number
var str = x.toString(); //string
암묵적
var x =10//snumber
var str = x+'';//string
둘 다 x는 그대로 number
명시적 vs 암묵적
개발자의 의도와는 상관 없이 자바스크립트 엔진이 표현식을 평가할 때 코드의 문맥을 고려해 암묵적으로 데이터 타입을 강제 변환(암묵적 타입 변환)할 때가 있다.
'10' + 2// '102'
5 * '10' // 50
!0 // true
if(1){}
원시 타입 중 하나로 타입 자동 변환
- 문자열
- 숫자
- 불리언
'10' + 2// '102'
0+'' //'0'
-0+'' //'0'
NaN + ''//'NaN'
Infinity + '' //'Infinity'
-Infinity + ''// '-Infinity'
이외
true, false, null, undefined 모두 글자 그대로 string으로 변환
심벌 타입은 문자열로 변환할 수 없다
({}) // "[object Object]"
Math // "[object Math]"
[] // ""
[요소1, 요소2] // "요소1, 요소2"
function(){} // "function(){}"
Array // function Array(){[native code]}
`1+1=${1+1}` // "1+1=2" (2가 원래 숫잔데 문자열로)
cf. 표현식의 피연산자도 표현식
산술 연산자
산술 연산자의 역할은 숫자 값으로 만드는 것
따라서 산술 연산자의 모든 피연산자는 코드 문맥상 모두 숫자 타입이어야 한다
-> 자바스크립트 엔진이 산술 연산자 표현식 평가 중 피연산자 중에서 숫자 타입이 아닌 것들을 숫자 타입으로 암묵적 타입 변환
-> 불가능 시 연산한 결과가 NaN이 된다
비교 연산자
비교 연산자의 역할은 불리언 값을 만드는 것
피연산자의 크기를 비교하므로 모든 피연산자는 숫자 타입이어야 한다
자바스크립트 엔진이 평가하기 위해 피연산자 중 숫자 타입이 아닌 피연산자를 숫자 타입으로 암묵적 타입 변환한다
가장 쉬운 방법 : 앞에 +붙이기
+'' // 0
+'0' // 0
+true//1
+false//0
+null//0
+[]//0
안 되는 애들
+'string'//NaN
+undefined//NaN
+Symbol()// typeError
{},[요소],function(){} //NaN
문자열, undefined, 심벌 , 객체, 요소 있는 배열, 함수는 모두 NaN
불리언 타입이 아닌 값 - 자바스크립트 엔진이 평가한 결과
제어문의 조건식과 같이 불리언 값으로 평가되어야 할 문맥에서 Truthy, Falsy가 true, false로 암묵적 타입 변환된다
조건식 등 불리언 평가 필요 시 : 자바스크립트 엔젠 평가 결과 Truthy/falsy -> 문맥에서 true/false로 암묵적 타입 변환
Falsy
false, undefined, null, 0, -0, NaN, ''
이외 모든 값은 Truthy
개발자의 의도에 따라 명시적으로 타입을 변경하는 방법
- 생성자 함수를 new 연산자 없이 호출하는 방법
- 빌트인 메서드를 사용하는 방법
- 암묵적 타입 변환을 이용하는 방법
표준 빌트인 생성자 함수와 빌트인 메서드
문자열 타입이 아닌 값을 문자열 타입으로 변환하는 방법
- String 생성자 함수를 new 연산자 없이 호출하는 방법
- Object.prototype.toString 메서드를 사용하는 방법
- 문자열 연결 연산자를 이용하는 방법
1.
String(1) // "1"
2.
(1).toString()//"1"
3.
1 + ''// "1"
- Number 생성자 함수를 new 연산자 없이 호출하는 방법
- parseInt, parseFloat 함수를 사용하는 방법 (문자열만 숫자 타입으로 변환 가능)
- 단항 산술 연산자를 이용하는 방법
- *산술 연산자를 이용하는 방법
1.
Number('0') //0
2.
parseInt('0') //0
3.
+'0'//0
+true // 1
4.
'0' * 1 // 0
true * 1 //1
불리언 타입이 아닌 값을 불리언 타입으로 변환하는 방법
- Boolean 생성자 함수를 new 연산자 없이 호출하는 방법
- !부정 논리 연산자를 두 번 사용하는 방법
1.
Boolean('x') // true
Boolean('') //false
Boolean(0) //false
Boolean(1) //true
2.
!!'x'//true
!!''//false
단축 평가
: 표현식을 평가하는 도중에 평가 결과가 확정된 경우 나머지 평가 과정을 생략하는 것**
'Cat' && 'Dog' //'Dog'
단축평가를 사용하면 if문을 대체할 수 있다
if(done) message = '완료'
//같은 의미
message = done && '완료'
'Cat' || 'Dog' //'Cat'
- true || anything : true
- false || anything : anything
- true && anything : anything
- false && anything : false
if(!done) message = '미완료'
//같은 의미
message = done || '완료'
if(done) message = '미완료'
else message = '완료'
//같은 의미
message = done ? '완료' : '미완료';
null, undefined인 변수를 객체라고 생각하고 프로퍼티를 참조하면 TypeError 발생.
var elem = null;
var value = elem.value // TypeError
var value = elem && elem.value
//elem이 falsy하니까 value = elem해서 null이 들어간다
//불리언이 아니라 값
방법1.
function getStringLength(str){
str = str || '';
return str.length;
}
getStringLength(); //0
-> 인자가 들어오지 않으면 str이 undefined로 falsy한 값이니까 ''니까 된다
방법2. default값 정하기
function getStringLength(str = ''){
return str.length;
}
getStringLength(); //0
var elem = null;
var value = elem?.value; //undefined
var value = elem && elem.value; //undefined
-> 둘이 같은 의미
옵셔널 체이닝 vs &&
var str='';
var length = str && str.length; //''
//falsy하니까 뒤에 anything이 되어야 하는데 ''가 된다
var str='';
var length = str?.length; //0
//undefined, null이 아니니까 ''로
|| vs ??
var foo = null ?? 'default string';//"default string"
var foo = '' ||'default string';//"default string"
//위의 둘은 같은 의미
var foo = '' ?? 'default string'; //''