1) JavaScript의 모든 값은 타입이 있다.
2) 명시적 타입 변환 == 타입 캐스팅
= 개발자가 의도적으로 값의 타입을 변환하는 것
3) 암묵적 타입 변환 == 타입 강제 변환
= 개발자의 의도와는 상관없이 JavaScript 엔진에 의해 암묵적으로 타입이 자동으로 변환되는 것 (코드의 문맥과 관계 있다)
var x = 10;
var str = x.toString(); //type casting
var x = 10;
var str = x+''; //type coercion
4) 타입 변환 == 기존 원시 값을 사용해 다른 타입의 새로운 원시 값을 생성하는 것!
1) 문자열 타입으로 변환
'+' 연산자는 피연산자 중 하나 이상이 문자열이면, 문자열 연결 연산자로 동작한다.
0+'' // "0"
-0+'' // "0"
-1+'' //"-1"
NaN+'' //"NaN"
true+'' //"true"
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]}"
2) 숫자 타입으로 변환
2-1) 산술 연산자
-, *, / 등은 모두 산술 연산자이다. 산술 연산자의 피연산자 중에서 숫자 타입이 아닌 피연산자는 숫자 타입으로 암묵적 타입 변환된다.
1-'1'; //0
1*'10' //10
1/'one' //NaN
2-2) 비교 연산자
'1'>0 //true
<, >와 같은 비교 연산자는 피연산자의 크기를 비교해야 하므로 모든 피연산자는 숫자 타입이어야 한다.
2-3) + 단항 연산자
'+' 단항 연산자의 모든 피연산자는 숫자 타입이어야 한다.
+'string' //NaN
+null //0
+{} //NaN
+[] //0
+[10,20] //NaN
+(function(){}) //NaN
3) boolean 타입으로 변환
3-1) JavaScript 엔진은 boolean type이 아닌 값을 Truthy 값 또는 Falsy 값으로 구분한다.
3-2) Falsy 값: false, undefined, null, 0, -0, NaN, ''(빈 문자열)
3-3) Falsy 값 외의 값은 모두 Truthy 값이다.
function isTruthy(v) {
return !!v;
}
isTruthy({}); //true
isTruthy([]); //true
isTruthy('0'); //true. 빈 문자열이 아니기 때문에
1) 명시적으로 타입을 변경하는 방법
1-1) 표준 빌트인 생성자 함수를 new 연산자 없이 호출
1-2) 빌트인 메소드 이용(빌트인 메소드는 JS에서 기본적으로 제공해준다.)
1-3) 암묵적 타입 변환 이용
2) 문자열 타입으로 변환
// 2-1) String 생성자 함수를 new 연산자 없이 호출
String(Infinity); //"Infinity"
// 2-2) Object.prototype.toString 메소드를 사용
(Infinity).toString(); //"Infinity"
// 2-3) 문자열 연결 연산자를 이용
Infinity+''; //"Infinity"
3) 숫자 타입으로 변환
// 3-1) Number 생성자 함수를 new 연산자 없이 호출
Number('10.53'); //10.53
// 3-2) parseInt, parseFloat 함수를 사용 (문자열만 변환 가능)
parseInt('5'); //5
parseFloat('10.53'); //10.53
// 3-3) + 단항 산술 연산자를 이용
+'10.53'; //10.53
// 3-3) * 산술 연산자를 이용
'0'*1; //0
4) boolean type으로 변환
//4-1) Boolean 생성자 함수를 new 연산자 없이 호출
Boolean('x'); //true
Boolean(''); //false
//4-3) ! 부정 논리 연산자를 두 번 사용
!!'x'; //true
!!''; //false
1) 단축 평가: 표현식을 평가하는 도중에 평가 결과가 확정된 경우, 나머지 평가 과정을 생략하는 것을 말한다.
2) 논리 연산자를 사용한 단축 평가
'Cat' || 'Dog'; //"Cat"
false || 'Dog'; //"Dog"
'Cat' && 'Dog'; //"Dog"
false && 'Dog'; //false
논리합, 논리곱 연산자 표현식 평가 결과는 항상 Boolean 값일 줄 알았다. 그런데, 논리합 또는 논리곱 연산자 표현식은 언제나 2개의 피연산자 중 어느 한쪽으로 평가된다고 한다.
'Cat' || 'Dog'; 가 true를 반환하는 것이 아닐까 했었는데, 'Cat'을 반환하는 이유도 이 사실과 관련이 있다. 'Cat' || 'Dog';에서는 첫 번째 피연산자인 'Cat'이 논리 연산의 결과를 결정하고 있기 때문에 'Cat'이 반환된다!!
var elem = null;
var value = elem.value; //에러 발생
var value2 = elem && elem.value; //에러 발생 x
객체가 아니라 null 또는 undefined인 경우 프로퍼티를 참조했을 때 타입 에러가 발생한다. 이때, 단축 평가를 사용하면 에러가 발생하지 않는다.
function getStringLength(str){
str = str || ''; //단축 평가 사용
return str.length;
}
function getStringLength(str=''){ //기본값 설정 가능
return str.length;
}
함수 호출 시, 인수를 전달하지 않으면 매개변수에 undefined가 할당된다. 이때 단축 평가를 사용하거나, 매개변수의 기본값을 설정해줌으로써 에러를 방지할 수 있다.
3) 옵셔널 체이닝 연산자
optional chaining 연산자는 '?.'이다.
좌항의 피연산자가 null이거나 undefined인 경우 undefined를 반환하고, 그렇지 않으면 우항의 property 참조를 이어 나간다.
var elem=null;
var value=elem?.value;
console.log(value); //undefined
4) null 병합 연산자
null 병합 연산자는 '??'이다.
좌항의 피연산자가 null 또는 undefined인 경우 우항의 피연산자를 반환하고, 그렇지 않으면 좌항의 피연산자를 반환한다.
const handleClick = () => {
let foo = null ?? "default string";
let foo2 = "not null" ?? "default string";
console.log(`foo: ${foo}, foo2: ${foo2}`);
//foo: default string, foo2: not null
};
좌항의 피연산자가 false로 평가되는 Falsy 값이더라도, null이나 undefined가 아니면 좌항의 피연산자를 그대로 반환한다.