모던 JS 딥다이브 공부 정리용 글입니다.
9장_ 타입 변환과 단축 평가
9.1_ 타입 변환이란?
- 개발자의 의도로 타입 변환 : 명시적 타입 변환 || 타입 캐스팅
- Explicit!
- 개발자의 의지가 코드에 명백히 드러남.
var x = 10;
var str = x.toString();
console.log(typeof str);
- JS엔진에 의한 자동 변환 : 암묵적 타입 변환 || 타입 강제 변환
- Implicit!
- 개발자의 의지가 코드에 명백히 나타나지 않음.
var x = 10;
var str = x + '';
console.log(typeof str, str);
console.log(x);
- 명시적 타입 변환이나 암묵적 타입 변환이 기존 원시 값 자체를 변경하는 것이 아님.
- 원시 값은 Immutable Value(변경 불가 값)이기 때문임.
- 타입 변환이란 기존 원시 값을 사용해 다른 타입의 새로운 원시 값을 생성하는 것.
- 명시적 타입 변환이 더 좋은 것 아닌가?
A) 항상 그렇지는 않다. 명시적보다 암묵적 타입 변환이 가독성 측면에서 좋을 수도 있기 때문이다.
ex - (10).toString()
vs 10 + ''
9.2_ 암묵적 타입 변환
- JS엔진은 표현식을 평가할 때 개발자의 의도와 상관없이 코드의 문맥을 고려해 암묵적으로 데이터 타입을 강제변환 하기도 한다.
9.2.1_ 문자열 타입으로 변환
0 + ''
-0 + ''
1 + ''
-1 + ''
NaN + ''
Infinity + ''
-Infinity + ''
true + ''
false + ''
null + ''
undefined + ''
(Symbol()) + ''
({}) + ''
Math + ''
[] + ''
[10, 20] + ''
(function(){}) + ''
Array + ''
9.2.2_ 숫자 타입으로 변환
+''
+'0'
+'1'
+'string'
+true
+false
+null
+undefined
+Symbol()
+{}
+[]
+[10, 20]
+(function(){})
9.2.3_ 불리언타입으로 변환
function isFalsy(v) {
return !v;
}
function isTruthy(v) {
return !!v;
}
console.log(isFalsy(false));
console.log(isFalsy(undefined));
console.log(isFalsy(null));
console.log(isFalsy(0));
console.log(isFalsy(NaN));
console.log(isFalsy(''));
console.log(isTruthy(true));
console.log(isTruthy('0'));
console.log(isTruthy({}));
console.log(isTruthy([]));
9.3_ 명시적 타입 변환
9.3.1_ 문자열 타입으로 변환
- String 생성자 함수를 new 연산자 없이 호출
- Object.prototype.toString 메서드를 사용
- 문자열 연결 연산자를 이용
console.log(String(1));
console.log(String(NaN));
console.log(String(Infinity));
console.log(String(true));
console.log(String(false));
console.log((1).toString());
console.log((NaN).toString());
console.log((Infinity).toString());
console.log((true).toString());
console.log((false).toString());
console.log(1 + '');
console.log(NaN + '');
console.log(Infinity + '');
console.log(true + '');
console.log(false + '');
9.3.2_ 숫자 타입으로 변환
- Number 생성자 함수 new 연산자 없이
- parseInt, parseFloat 함수 사용(문자열만 가능)
- 단항 연산자
- 산술 연산자
console.log(Number('0'));
console.log(Number('-1'));
console.log(Number('10.53'));
console.log(Number(true));
console.log(Number(false));
console.log(parseInt('0'));
console.log(parseInt('-1'));
console.log(parseFloat('10.53'));
console.log(+'0');
console.log(+'-1');
console.log(+'10.53');
console.log(+true);
console.log(+false);
console.log('0' * 1);
console.log('-1' * 1);
console.log('10.53' * 1);
console.log(true * 1);
console.log(false * 1);
9.3.3_ 불리언 타입으로 변환
console.log(Boolean('x'));
console.log(Boolean(''));
console.log(Boolean('false'));
console.log(Boolean(0));
console.log(Boolean(1));
console.log(Boolean(NaN));
console.log(Boolean(Infinity));
console.log(Boolean(null));
console.log(Boolean(undefined));
console.log(Boolean({}));
console.log(Boolean([]));
console.log(!!'x');
console.log(!!'');
console.log(!!'false');
console.log(!!0);
console.log(!!1);
console.log(!!NaN);
console.log(!!Infinity);
console.log(!!null);
console.log(!!undefined);
console.log(!!{});
console.log(!![]);
9.4_ 단축 평가
'Cat' || 'Dog'
false || 'Dog'
'Cat' || false
'Cat' && 'Dog'
false && 'Dog'
'Cat' && false
-------------------------
function getStringLength(str) {
str = str || '';
return str.length;
}
getStringLength();
getStringLength('hi');
function getStringLength(str = '') {
return str.length;
}
getStringLength();
getStringLength('hi');