JavaScript

[JS] 모던 자바스크립트 - 05. 타입 변환과 단축 평가

개발자 조이 2021. 8. 29. 02:24
728x90
반응형

타입 변환


- 기존 원시 값을 사용해 다른 타입의 새로운 원시 값을 생성. 기존 원시 값을 직접 변경 X

 

암묵적 타입 변환

- 개발자의 의도와는 상관 없이 자바스크립트 엔진에 의해 타입이 변환되는 것, 타입 강제 변환(type coercion)이라고도 함

- 자바스크립트 엔진은 표현식을 에러 없이 평가하기 위해 암묵적 타입 변환으로 새로운 타입의 값을 만들어 단 한 번만 사용 후 버림

 

1. 문자열 타입 변환

- 문자열 연결 연산자 사용 시 피연산자 중 문자열이 아닌 타입이 있을 경우, 문자열 타입으로 암묵적 타입 변한

- ES6에 도입된 템플릿 리터럴의 표현식 삽입은 표현식의 평가 결과를 문자열 타입으로 암묵적 타입 변환

 

2. 숫자 타입 변환

- 산술 연산자 사용 시 피연산자 중 숫자 타입이 아닌 경우, 숫자 타입으로 암묵적 타입 변환

- 비교 연산자 사용 시, + 단항 연산자 사용 시에도 마찬가지

  ex) 빈 문자열(' '), 빈 배열([ ]), null, false는 0으로, true는 1로 변환

 

3. 불리언 타입 변환

- 조건식의 평가 결과를 불리언 타입으로 암묵적 타입 변환

- 자바스크립트 엔진은 불리언 타입이 아닌 값을 Truthy 값(참으로 평가되는 값) 또는 Falsy 값(거짓으로 평가되는 값)으로 구분

- Falsy 값 : false, undefined, null, 0, -0, NaN, ' '(빈 문자열)

- Truthy 값 : Falsy 값이 아닌 모든 값

 


명시적 타입 변환

- 개발자가 의도적으로 값의 타입을 변환하는 것, 타입 캐스팅(type casting)이라고도 함

 

1. 문자열 타입 변환

- String(변환할 값) - new 연산자 없이 호출하는 String 생성자 함수

- (변환할 값).toString - Object.prototype.toString 메서드

- 변환할 값 + ' ' - 문자열 연결 연산자 

 

2. 숫자 타입 변환

- Number(변환할 값) - new 연산자 없이 호출하는 Number 생성자 함수

- parseInt(변환할 값), parseFloat(변환할 값) 함수 (문자열만 숫자타입으로 변환 가능)

- + (변환할 값) - +단항 산술 연산자 

(변환할 값)*1 - * 산술 연산자 

 

3. 불리언 타입 변환1. 문자열 타입 변환

- Boolean(변환할 값) - new 연산자 없이 호출하는 Boolean 생성자 함수

- !!(변환할 값) - ! 부정 논리 연산자를 두번 사용

 

 

단축 평가


- 표현식을 평가하는 도중에 평가 결과가 확정된 경우 나머지 평가 과정을 생략

 

1. 논리 연산자

- 논리합(||) 또는 논리곱(&&) 연산자 표현식은 언제나 2개의 피연산자 중 한쪽으로 평가

 

&&(논리곱) 연산자

- 좌항에서 우항으로 평가가 진행

- 전부 true인 경우 제일 우항의 값을 반환

'CAT'&&'DOG' // 'DOG'

- 첫번째 false가 되는 값 반환

'CAT'&&''&&'DOG' // ''
'CAT'&&false&&'' // false

- 조건이 Truthy값일 때 로직을 실행한다면 if문을 대체 가능

var done = true;
var message = '';

// 조건이 true 일 때
if (done) message = '완료';

// 논리곱으로 if문 대체
message = done&&'완료';

 

||(논리합) 연산자

- 좌항에서 우항으로 평가가 진행

- 첫번째로 true가 되는 값을 반환

'CAT'||'DOG' // 'CAT'
''||'CAT'||''||'DOG' // 'CAT'

- 전부 false일 경우에는 제일 우항의 값 반환

''||''||false||undefined // undefined

- 조건이 Falsy값일 때 로직을 실행한다면, if문을 대체 가능

var done = false;
var message = '';

// 조건이 false 일 때
if (!done) message = '미완료';

// 논리합으로 if문 대체
message = done||'미완료';

 

활용방안

- 객체를 가리키는 변수가 null 또는 undefined인지 확인하고 프로퍼티를 참조할 때

var elem = null;
var value = elem.value; // TypeError...

// 단축 평가 적용
var elem = null;
var value = elem && elem.value; // null, TypeError 발생하지 않음.

- 함수 매개변수에 기본값 설정할 때

// 단축 평가로 매개변수의 기본값 설정
function getStringLength(str) {
    str = str || '';
    return str.length;
}

getStringLength(); // 0
getStringLength('hi'); //2

// ES6의 매개변수의 기본값 설정
function getStringLength(str='') {
    return str.length;
}

getStringLength(); // 0
getStringLength('hi'); //2

 

2. 옵셔널 체이닝 연산자 (?.)

- ES11에서 도입

- 좌항의 피연산자가 null 또는 undefined인 경우 undefined 반환, 그렇지 않으면 우항의 프로퍼티 참조를 이어감

- 객체를 가리키는 변수가 null 또는 undefined인지 확인하고 프로퍼티를 참조할 때 유용

var elem = null;
var value = elem?.value; // undefiend

- 논리연산자보다 유용한 경우 (' '(빈문자열)이 객체로 평가될 때)

var str = '';

var length = str&&str.length;
console.log(length); // '', 문자열의 길이를 참조하지 못함

var length = str?.length;
console.log(length); // 0

 

3. null 병합 연산자(??)

- ES11에서 도입

- 좌항의 피연산자가 null 또는 undefined인 경우 우항의 피연산자 반환, 그렇지 않으면 좌항의 피연산자 반환

- 변수의 기본값을 설정할 때 유용

var foo = null ?? 'default string';
console.log(foo); // 'default string'

 

 

 

 

출처

- 모던 자바스크립트 Deep Dive - 자바스크립트의 기본 개념과 동작 원리

728x90
반응형