Today I Learned 15 - JavaScript Deep Dive / 타입 변환과 단축 평가

angie·2022년 6월 27일
0

JavaScript Deep Dive

목록 보기
6/18
post-thumbnail

본 포스팅은 '모던 자바스크립트 Deep Dive'를 기반으로 공부한 내용을 정리한 것입니다.

1. 타입 변환이란?

  • 명시적 타입 변환 : 개발자가 의도적으로 값의 타입을 변환하는 것
  • 암묵적 타입 변환 : 자바스크립크 엔진에 의해 타입이 자동으로 변환되는 것

명시적 타입 변환이나 암묵적 타입 변환이나 기존 원시 값을 직접 변경하는 것은 아니다. 원시값은 변경 불가능한 값이므로 변경할 수 없다. 타입 변환이란 기존 원시 갑을 사용해 다른 타입의 새로운 원시 값을 생성하는 것이다.

2. 암묵적 타입 변환

자바스크립트 엔진은 코드의 문맥을 고려해 암묵적으로 데이터 타입을 강제로 변환할 때가 있다.

1) 문자열 타입으로 변환

1 + '2' // "12"

+ 연산자는 피연산자 중 하나 이상이 문자열일 때 문자열 연결 연산자로 동작한다. 따라서 모든 피연산자는 문맥상 모두 문자열 타입이어야하므로, 문자열로 암묵적 타입 변환이 이루어진다.

example

// 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

2) 숫자 타입으로 변환

산술 연산자

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 = 0
  • true = 1
  • 객체, 빈 배열이 아닌 배열, undefined는 변환되지 않음 = NaN

3) 불리언 타입으로 변환

제어문 또는 삼항 조건 연산자의 조건식은 불리언 값으로 평가되어야하므로, 조건식의 평가 결과를 불리언 타입으로 암묵적 타입 변환한다.

falsy 값

  • false
  • undefined
  • null
  • 0, -0
  • NaN
  • '' (빈 문자열)

truthy 값

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

3. 명시적 타입 변환

개발자의 의도에 따라 명시적으로 타입을 변경하는 방법

  • 표준 빌트인 생성자 함수(String, Number, Boolean)을 new 연산자 없이 호출하는 방법
  • 빌트인 메서드를 사용하는 방법
  • 암묵적 타입 변환을 이용하는 방법

1) 문자열 타입으로 변환

문자열 타입으로 변환하는 방법

  1. String 생성자 함수를 new 연산자 없이 호출
  2. object.prototpe.toString 메서드를 사용
  3. 문자열 연결 연산자를 이용
// 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"

2) 숫자 타입으로 변환

숫자 타입으로 변환하는 방법

  1. Number 생성자 함수를 new 연산자 없이 호출
  2. parseInt, parseFloat 함수를 사용 (문자열만 변환 가능)
  3. + 단항 산술 연산자 이용
  4. * 산술 연산자를 이용
// 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

3) 불리언 타입으로 변환

불리언 타입으로 변환하는 방법

  1. Boolean 생성자 함수를 new 연산자 없이 호출
  2. ! 부정 논리 연산자를 두 번 사용
// 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

4. 단축 평가

1) 논리 연산자를 사용한 단축 평가

단축평가

: 표현식을 평가하는 도중에 평가 결과가 확정된 경우 나머지 평가 과정을 생략하는 것을 말한다.

논리곱(&&) 연산자

두 개의 피연산자가 모두 true로 평가될 때 true를 반환한다.

'Cat' && 'Dag'   // "Dog"

위의 예제에서 첫번째 피연산자인 'Cat'은 Truthy 값이므로 두 번째 피연산자인 'Dog'의 값에 따라 평가 결과가 결정된다. 따라서 논리 연산의 결과를 결정하는 두 번째 피연산자가 반환된다.

논리합(||) 연산자

두 개의 피연산자 중 하나만 true로 평가되어도 true를 반환한다.

'Cat' || 'Dog'    // 'Cat'

위의 예제에서 'Cat'은 Truthy 값이므로 true로 평가된다. 이 때 이미 true로 평가된 연산자가 등장했으므로, 연산의 결과를 결정짓는 피연산자인 'Cat'이 반환된다.

단축 평가의 규칙

단축 평가 표현식평가 결과
true || anythingtrue
false || anythinganything
true && anythinganything
false && anythingfalse

단축 평가를 활용한 if 문의 대체

논리곱(&&) 연산자의 활용

어떤 조건이 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 를 반환하는 논리구조를 활용하는 것!


2) 옵셔널 체이닝 연산자

옵셔녈 체이닝 연산자 ?.는 좌항의 피연산자가 Falsy 값이라도 null 또는 undefined가 아니라면 우항의 프로퍼티 참조를 이어간다. null이나 undefined라면 undefined를 반환한다.

객체를 가리키기를 기대하는 변수가 null 또는 undefined가 아닌지 확인하고 프로퍼티를 참조할 때 유용하다.

var str = '';

// 좌항의 피연산자인 str이 null이나 undefined가 아니므로 .length를 실행
var length = str?.length;
console.log(length);   // 0

3) null 병합 연산자

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);   // ""
profile
better than more

0개의 댓글