Study/JavaScript

모던 자바스크립트 Deep Dive - 9장 타입 변환과 단축 평가

ujam 2023. 6. 28. 21:03
728x90
반응형

📌 목차

- 타입 변환
- 암묵적 타입 변환

- 명시적 타입 변환
- 단축 평가

 

 


 💡 타입 변환

기존 원시 값을 사용하여 다른 타입의 새로운 원시 값을 생성하는 것이다.

 


 💡 암묵적 타입 변환

개발자의 의도와는 상관없이 표현식을 평가하는 도중에 자바스크립트 엔진에 의해 암묵적으로 타입이 자동 변환되는 것을 암묵적 타입 변환이라고 한다.

또는 타입 강제 변환이라고 한다.

자바스크립트 엔진은 연산자의 본래 성격과 목적을 기준으로 최대한 에러가 나지 않는 방향으로 타입을 암묵적으로 변환한다.

 

 

 

1. 문자열 타입으로 변환

 

아래 예제의 + 는 피연산자 중 하나 이상이 문자열이므로 문자열 연결 연산자로 동작한다.

 - 코드 문맥에 부합하도록 암묵적 타입 변환을 실행한다.

 

1 + '234' // "1234"

 

 

템플릿 리터럴 표현식 삽입은 표현식의 평가 결과를 문자열 타입으로 암묵적 타입 변환한다.

`1 + 2 = ${1 + 2}` // "1 + 2 = 3"

 

// 숫자 타입 -> 문자열 타입
0 + ''         // "0"
-0 + ''        // "0"

// 타입이 number가 아니라 string이다.
1 + ''         // "1"
-1 + ''        // "-1"
NaN + ''       // "NaN"   :
Infinity + ''  // "Infinity"
-Infinity + '' // "-Infinity"
// 불리언 타입 -> 문자열 타입
true + ''  // "true"
false + '' // "false"
// null 타입 -> 문자열 타입
null + '' // "null"
// undefined 타입 -> 문자열 타입
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. 숫자 타입으로 변환

 

 

산술 연산자의 모든 피연산자는 코드 문맥상 모두 숫자 타입이어야 한다.

피연산자를 숫자 타입으로 변환해야 할 문맥에서 숫자 타입이 아닌 피연산자를 숫자 타입으로 암묵적 타입 변환한다.

피연산자를 숫자 타입으로 변환할 수 없는 경우는 산술 연산을 수행할 수 없으므로 표현식의 평가 결과는 NaN이 된다.

 

1 - '1'   //  0
1 * '2'  // 2
1 + 'two' //  NaN
// 문자열 타입
+''       // 0
+'0'      // 0
+'1'      // 1
+'string' // NaN

// 불리언 타입
+true     // 1
+false    // 0

// null 타입
+null     // 0
// undefined 타입
+undefined // NaN

// 심벌 타입
+Symbol() // TypeError: Cannot convert a Symbol value to a number

// 객체 타입
+{}             // NaN
+[]             // 0
+[10, 20]       // NaN
+(function(){}) // NaN

 

 

3. 불리언 타입으로 변환

 

if문이나 for문과 같은 제어문 또는 삼항 조건 연산자의 조건식에서 논리적 참/거짓을 평가한다.

자바스크립트 엔진은 조건식의 평가 결과를 불리언 타입으로 암묵적 타입 변환한다.

 

 

false로 평가되는 Falsy값

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

 💡 명시적 타입 변환

개발자가 의도적으로 값의 타입을 변환하는 것을 명시적 타입 변환이라 한다.

또는 타입 캐스팅이라 한다.

 

 

 

표준 빌트인 생성자 함수와 빌트인 메서드

 

자바스크립트에서 기본 제공하는 함수다.
표준 빌트인 생성자 함수 객체를 생성하기 위한 함수이며 new 연산자와 함께 호출한다.
표준 빌트인 메서드 자바스크립트에서 기본 제공하는 빌트인 객체의 메서드다.

 

 

 

1. 문자열 타입으로 변환

 

 

String 생성자 함수를 new 연산자 없이 호출하는 방법

// 숫자 타입
String(1);        // "1"
String(NaN);      // "NaN"
String(Infinity); // "Infinity"
// 불리언 타입
String(true);     // "true"
String(false);    // "false"

 

 

Object.prototype.toString 메서드를 사용하는 방법

// 숫자 타입
(1).toString();        // "1"
(NaN).toString();      // "NaN"
(Infinity).toString(); // "Infinity"
// 불리언 타입
(true).toString();     // "true"
(false).toString();    // "false"

 

 

문자열 연결 연산자를 이용하는 방법

// 숫자 타입
1 + '';        // "1"
NaN + '';      // "NaN"
Infinity + ''; // "Infinity"
// 불리언 타입
true + '';     // "true"
false + '';    // "false"

 

 

 

2. 숫자 타입으로 변환

 

 

Number 생성자 함수를 new 연산자 없이 호출하는 방법

// 문자열 타입
Number('0');     // 0
Number('-1');    // -1
Number('10.53'); // 10.53
// 불리언 타입
Number(true);    // 1
Number(false);   // 0

 

 

parseInt, parseFloat 함수를 사용하는 방법(문자열만 변환 가능)

// 문자열 타입 => 숫자 타입
parseInt('0');       // -> 0
parseInt('-1');      // -> -1
parseFloat('10.53'); // -> 10.53

 

 

단항 산술 연산자를 이용하는 방법

// 문자열 타입
+'0';     // 0
+'-1';    // -1
+'10.53'; // 10.53
// 불리언 타입
+true;    // 1
+false;   // 0

 

 

산술 연산자를 이용하는 방법

// 문자열 타입
'0' * 1;     // 0
'-1' * 1;    // -1
'10.53' * 1; // 10.53
// 불리언 타입
true * 1;    // 1
false * 1;   // 0

 

 

 

3. 불리언 타입으로 변환

 

 

Boolean 생성자 함수를 new 연산자 없이 호출하는 방법

// 문자열 타입
Boolean('x');       // true
Boolean('');        // false
Boolean('false');   // true

// 숫자 타입
Boolean(0);         // false
Boolean(1);         // true
Boolean(NaN);       // false
Boolean(Infinity);  // true

// null 타입
Boolean(null);      // false

// undefined 타입
Boolean(undefined); // false

// 객체 타입
Boolean({});        // true
Boolean([]);        // true

 

 

 부정 논리 연산자(!)를 두번 사용하는 방법

// 문자열 타입
!!'x';       // true
!!'';        // false
!!'false';   // true

// 숫자 타입
!!0;         // false
!!1;         // true
!!NaN;       // false
!!Infinity;  // true

// null 타입
!!null;      // false

// undefined 타입
!!undefined; // false

// 객체 타입
!!{};        // true
!![];        // true

 


 

 💡 단축 평가

 

 

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

 

조건문에서 사용되면 true, false로 평가되지만, 표현식을 평가하는 도중에 평과 결과가 확정된 경우 나머지 평가 과정을 생략하는 것을 말한다.

 

단축 평가를 사용하면 if문을 대체할 수 있다

var done = true;
var message = '';

// if...else 문
if (done) message = '완료';
else      message = '미완료';
console.log(message); // 완료

// if...else 문은 삼항 조건 연산자로 대체 가능하다.
message = done ? '완료' : '미완료';
console.log(message); // 완료

 

 

논리곱(&&) 연산자는 두 개의 피연산자가 모두 true로 평가될 때 true를 반환한다.

'Cat' && 'Dog' // -> "Dog"

 

논리합(||) 연산자는 둘 중 하나가 true이면 true 반환

'Cat' || 'Dog' // -> "Cat"

 

 

 

옵셔널 체이닝 연산자

 

옵셔널체이닝(.?)은 좌항의 피연산자가 null 또는 undefined인 경우 undefined를 반환하고, 그렇지 않으면 우항의 프로퍼티 참조를 이어간다.

var element = null;

var value = element?.value;
console.log(value); // undefined

 

.? 도입 이전에는 &&를 이용하여 null 또는 undefined 여부를 확인했다.

var element = null;

var value = element && element.value;
console.log(value); // null

 

0이나 ''은 객체로 평가될 때도 있다.

var str = '';

// 문자열의 길이를 참조한다.
var length = str && str.length;

// 문자열의 길이를 참조하지 못한다.
console.log(length); // ''

 

.? 는 좌항의 피연산자가 falsy 값(false, undefined, null, 0, -0, NaN, ‘ ‘)이더라도 null, undefined가 아니면 우항의 프로퍼티 참조를 이어간다.

var str = '';

// 문자열의 길이(length)를 참조한다. 이때 좌항 피연산자가 false로 평가되는 Falsy 값이라도
// null 또는 undefined가 아니면 우항의 프로퍼티 참조를 이어간다.
var length = str?.length;
console.log(length); // 0

 

 

null 병합 연산자

 

 

null 병합 연산자는(??) 좌항의 피연산자가 null 또는 undefined이면 우항의 피연산자를 반환하고, 그렇지 않으면 좌항의 피연산자를 반환한다.

var str = null ?? 'string';
console.log(str); // "string"

 

좌항의 피연산자가 Falsy 값이라도 null 또는 undefined가 아니면 좌항의 피연산자를 반환한다.

var str = '' ?? 'string';
console.log(str); // ""
728x90
반응형