타입변환이란?
값의 타입은 개발자의 의도에 따라 다른 타입으로 변환할 수 있다.
- 명시적 타입 변환(타입 캐스팅)
- 개발자가 의도적으로 값의 타입을 변환하는 것
- 암묵적 타입 변환(타입 강제변환)
- 개발자의 의도와 관계없이 표현식 평가 도중에 자바스크립트 엔진에 의해 암묵적으로 변환되는 경우
둘다 기존 원시값을 직접 변경시키는 것이 아니다. 원시값은 변경불가능 값으로 변경시킬 수 없다.
암묵적 타입 변환 예시
var x=10;
var str=x+'';
console.log(typeof str, str); //string, 10
console.log(typeof x, x); // number, 10
암묵적 타입 변환은 원래 것을 건들이지 않고, 새로운 것을 만들어 낸다.
암묵적 타입 변환
JS엔진은 표현식을 평가할 때 개발자의 의도와는 관계없이 코드의 문맥만들 고려하여 암묵적으로 데이터 타입을 강제 변환할 때가 있다.
'10'+2 //'102'
5*'10' //50
!0 //true
문자열 타입으로 변환
- 피연산자에 문자열이 포함된 + 연산자
1+'2' //12
- 템플릿 리터럴의 표현식 삽입
`1+1=${1+1}`
- 문자열 아닌 값의 문자열 타입 변환
0+''//'0' -0+'0' //'0' 1+'' //'1' -1+'' //'-1' NaN + '' //'NaN' Infinity + '' //'Infinity' -Infinity + '' //'-Infinity' true+'' //'true' false+''//'false' null + '' //'null' undefined + '' //'undefined' (Symbol())+'' //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
- 부등호(>,<,≥,≤)의 피연산자
-
- 단항 연산자 역시 피연산자를 산술연산자로 변환함
+'' //0 +'0' //0 +'1' //1 +'string' //NaN +true //1 +false //0 +null //0 +undefined //NaN +Symbol() //TypeError +{} //NaN +[] //0 +[10,20] //NaN +(function(){}) //NaN
불리언 타입으로 변환
if문이나 for문, 삼항연선자의 조건식은 불리언값이 와야하므로 해당 결과를 암묵적으로 불리언 값으로 변환함
JS엔진은 불리언 타입이 아닌 값을 Truely값과 Fasly 값으로 구분함
해당 값들은 falsy값임
false, undefined, null, 0, -0, NaN, ‘’
명시적 타입변환
- 표준 빌트인 생성자 함수를 new 연산자 없이 호출
- String, Number, Boolean
- 암묵적 타입 변환을 활용
문자열 타입으로 변환
문자열 타입이 아닌 값을 문자열 타입으로 변환하는 방법
- String 생성자 함수를 new 연산자 없이 호출
- Object.prototype.toString메서드
- 문자열 연결 연산자 이용
Stirng(1) //"1"
String(NaN) //"NaN"
String(Infinity) //"Infinity"
String(true) //"true"
String(false) //"false"
(1).toString();
(NaN).toString();
1+""
NaN+""
숫자타입으로 변환
- Number 생성자 함수 new 연산자 없이 호출
- parseInt, parseFloat 함수 → 문자열만 숫자타입으로 변환가능
-
- 단항 산술연산자 이용
- 산술연산자를 이용 →1을 하면 됨
불리언 타입으로 변환
- Boolean 생성자 함수를 new 연산자 없이 사용
- !(부정 논리 연산자)를 두 번 사용
단축평가
피연산자를 타입 변환하지 않고 결과를 반환하는 것
표현식을 평가하는 도중에 평가가 확정된 경우 나머지 평가과정을 생략하는 것
논리 연산자를 사용한 단축평가
&&와 ||연산자는 항상 2개의 피연산자 중 어느 하나로 평가된다.
&& 연산자는 두번째 피연산자의 값을 그대로 반환한다.
|| 연산자는 첫번째 피연산자의 값을 그대로 반환한다.
"Dog"&&"Cat" //"Cat"
"Cat"||"Dog" //"Cat"
이 결과는 피연산자를 타입변환하지 않고 그대로 반환한다.
이를 단축평가라고 한다.
단축평가는 이 규칙을 따른다.
| true || anything | true |
| --- | --- |
| false || anything | anything |
| true && anything | anything |
| false && anything | false |
⇒ 단축평가를 사용하여 if문을 대체하면 됨
truely 값인 경우
var done=true;
var message="something"
if(done) console.log(message);
//대체하기
var done=true;
var message=done && "something";
console.log(message);
falsy 값인 경우
var done=false;
var message="something";
if(!done) console.log(message);
var done=false;
var message=done||"something";
console.log(message);
활용
객체에서 활용하기
var elem=null;
var value=elem.value; //TypeError
var value=elem&&elem.value; //null
elem이 null이므로 사용가능함 객체인경우 truely값이므로 사용불가
옵셔널 체이닝 연산자 (ES11)
객체?.멤버 가 존재하지 않는경우 undefined인 경우 undefined를 반환함
옵셔널 체이닝 이전에는 단축평가로 해결함
obj?.value
obj&&obj.value;
&&와 ?.
좌항 피연산자가 Falsy인 경우 좌항 피연산자를 그대로 반환한다.
⇒ 좌항부터 연산하여 둘다 true인 경우 우항피연산자를, 아닌경우 좌항피연산자를 반환한다.
var str='';
var l=str&&str.length;
console.log(l); //''
옵셔널 체이닝의 경우에는 좌항이 falsy값이어도 null이나 undefined가 아니면 평가를 이어나간다.
var str = '';
console.log(str && str.length); //''
console.log(str?.length); //0
null 병합 연산자 (ES11)
null 병합연산자 ??는 좌항의 피연산자가 null 또는 undefined인 경우 우항의 피연산자를 반환하고, 그렇지 않으면 좌항의 피연산자를 반환한다.
var foo = null ?? 'default string';
console.log(foo); //default string
var foo = 'default' ?? null;
console.log(foo); //default
||와 ??의 차이
var foo=''??'default string';
console.log(foo); //"default string"
foo=''||'default string'
console.log(foo); //''
||를 사용하는경우 좌항이 falsy로 판단되면 좌항을 반환
??를 사용하면 null이나 undefined가 아니면 우항을 반환