본 포스팅은 '모던 자바스크립트 Deep Dive'를 기반으로 공부한 내용을 정리한 것입니다.
명시적 타입 변환이나 암묵적 타입 변환이나 기존 원시 값을 직접 변경하는 것은 아니다. 원시값은 변경 불가능한 값이므로 변경할 수 없다. 타입 변환이란 기존 원시 갑을 사용해 다른 타입의 새로운 원시 값을 생성하는 것이다.
자바스크립트 엔진은 코드의 문맥을 고려해 암묵적으로 데이터 타입을 강제로 변환할 때가 있다.
1 + '2' // "12"
+
연산자는 피연산자 중 하나 이상이 문자열일 때 문자열 연결 연산자로 동작한다. 따라서 모든 피연산자는 문맥상 모두 문자열 타입이어야하므로, 문자열로 암묵적 타입 변환
이 이루어진다.
// Number Type
0 + '' // "0"
-0 + '' // "0"
NaN + '' // "NaN"
Infinity + '' // "Infinity"
// Boolean Type
true + '' // "true"
false + '' // "false"
// null type
null + '' // "null"
// undefined type
undefined + '' // "undefined"
// Symbol type
(Symbol()) + '' // TypeError: Cannot convert a Symbol value to a string
1 - '1' // 0
1 * '10' // 10
1 / 'one' // NaN
산술 연산자
를 사용하면 모든 피연산자는 문맥상 모두 숫자 타입이어야하므로, 숫자 타입으로 암묵적 타입 변환
이 이루어진다.
'1' > 0. // true
비교 연산자
또한 피연산자의 크기를 비교하므로 모든 피연산자는 문맥상 숫자 타입이어야한다.
피연산자가 숫자 타입의 값이 아니면 숫자 타입의 값으로 암묵적 타입 변환
을 수행한다.
// String type
+''. // 0
+'0' // 0
+'string' //NaN
// Boolean type
+true // 1
+false. // 0
// null type
+null // 0
// undefined type
+undefined // NaN
// Symbol type
+Symbol() // TypeError: Cannot convert a Symbol value to a number
// Object type
+{} // NaN
+[] // 0
+[10, 20] // NaN
+(function(){}) // NaN
''
), 빈 배열([]
), null
, false
= 0true
= 1객체
, 빈 배열이 아닌 배열
, undefined
는 변환되지 않음 = NaN
제어문 또는 삼항 조건 연산자의 조건식
은 불리언 값으로 평가되어야하므로, 조건식의 평가 결과를 불리언 타입으로 암묵적 타입 변환
한다.
falsy 값 외의 모든 값은 모두 true로 평가되는 truthy 값이다.
if('') console.log('1');
if(true) console.log('2');
if(0) console.log('3');
if('str') console.log('4')
if(null) console.log('5');
// 2 4
개발자의 의도에 따라 명시적으로 타입을 변경하는 방법
String
, Number
, Boolean
)을 new
연산자 없이 호출하는 방법문자열 타입으로 변환하는 방법
// 1. String 생성자 함수 호출
String(1); // "1"
String(NaN); // "NaN"
String(Infinity) // "Infinity"
String(true); // "true"
String(false); // "false"
// 2. Object.prototype.toSring 메서드
(1).toString(); // "1"
(NaN).toString(); // "NaN"
(Infinity).toString(); // "Infinity"
// 3. 문자열 연결 연산자
1 + ''; // "1"
NaN + ''; // "NaN"
Infinity + ''; // "Infinity"
true + ''; // "true"
false + ''; // "false"
숫자 타입으로 변환하는 방법
Number
생성자 함수를 new
연산자 없이 호출parseInt
, parseFloat
함수를 사용 (문자열만 변환 가능)+
단항 산술 연산자 이용*
산술 연산자를 이용// 1. Number 생성자 함수를 호출
Number('0'); // 0
Number('-1'); // -1
Number(true); // 1
Number(false); // 0
// 2. parseInt, parseFloat 함수 사용
parseInt('0'); // 0
parseInt('-1'); // -1
parseFloat('10.53'); // 10.53
// 3. + 단항 산술 연산자를 이용
+'0'; // 0
+'-1'; // -1
+true; // 1
+false; // 0
// 4. * 산술 연산자를 이용
'0' * 1; // 0
'-1' * 1; // -1
true * 1; // 1
false * 1; // 0
불리언 타입으로 변환하는 방법
Boolean
생성자 함수를 new
연산자 없이 호출!
부정 논리 연산자를 두 번 사용// 1. Boolean 생성자 함수를 호출
Boolean('x'); // true
Boolean(''); // false
Boolean('false') // true
Boolean(0); // false
Boolean(1); // true
Boolean(NaN); // false
Boolean(Infinity); // true
Boolean(null); // false
Boolean(undefined) // false
Boolean({}); // true
Boolean([]); // true
// 2. 부정 논리 연산자 두 번 사용
!!'x'; // true
!!''; // false
!!'false'; // true
!!0; // false
!!1; // true
!!NaN; // false
!!Infinity; // true
!!null; // false
!!undefined; // false
!![]; // true
!!{}; // true
: 표현식을 평가하는 도중에 평가 결과가 확정된 경우 나머지 평가 과정을 생략하는 것을 말한다.
두 개의 피연산자가 모두 true로 평가될 때 true를 반환한다.
'Cat' && 'Dag' // "Dog"
위의 예제에서 첫번째 피연산자인 'Cat'은 Truthy 값이므로 두 번째 피연산자인 'Dog'의 값에 따라 평가 결과가 결정된다. 따라서 논리 연산의 결과를 결정하는 두 번째 피연산자가 반환된다.
두 개의 피연산자 중 하나만 true로 평가되어도 true를 반환한다.
'Cat' || 'Dog' // 'Cat'
위의 예제에서 'Cat'은 Truthy 값이므로 true로 평가된다. 이 때 이미 true로 평가된 연산자가 등장했으므로, 연산의 결과를 결정짓는 피연산자인 'Cat'이 반환된다.
단축 평가 표현식 | 평가 결과 |
---|---|
true || anything | true |
false || anything | anything |
true && anything | anything |
false && anything | false |
어떤 조건이 Truthy 값일 때 무언가를 실행하는 if
문
피연산자1 && 피연산자2
일 때,피연산자1
이 true라면피연산자2
를 반환하는 논리구조를 활용하는 것!
var done = true;
var message = '';
// 첫번째 피연산자의 값이 true이므로 두번째 피연산자를 반환
message = done && '완료';
console.log(message); // 완료
어떤 조건이 Falsy 값일 때 무언가를 실행하는 if
문
피연산자1 || 피연산자2
일 때, 피연산자1이 false라면 피연산자2 를 반환하는 논리구조를 활용하는 것!
옵셔녈 체이닝 연산자 ?.
는 좌항의 피연산자가 Falsy 값이라도 null
또는 undefined
가 아니라면 우항의 프로퍼티 참조를 이어간다. null
이나 undefined
라면 undefined
를 반환한다.
객체를 가리키기를 기대하는 변수가
null
또는undefined
가 아닌지 확인하고 프로퍼티를 참조할 때 유용하다.
var str = '';
// 좌항의 피연산자인 str이 null이나 undefined가 아니므로 .length를 실행
var length = str?.length;
console.log(length); // 0
null 병합 연산자 ??
는 좌항의 피연산자가 null 또는 undefined인 경우 우항의 피연산자를 반환하고, 그렇지 않으면 좌항의 피연산자를 반환한다.
변수에 기본값을 설정할 때 유용하다.
var foo = '' || 'default string';
console.log(foo) // "default string"
위의 예제에서 논리합을 사용한 단축평가로 변수의 기본값을 설정했다. 여기서 변수의 기본값을 좌항의 피연산자인 ''로 하고 싶다면, 이 또한 falsy값이기 때문에 'default string'을 반환한다.
falsy값인 0이나 ''도 기본값으로 유효한 상황일 때, null 병합 연산자인 ??를 사용한다. null
또는 undefined
가 아니라면 좌항의 피연산자를 그대로 반환하기 때문에 falsy값인 0과 ''도 유효하다.
var foo = '' ?? 'default string';
console.log(foo); // ""