deep dive - 타입변환, 단축 평가

CH_Hwang·2024년 6월 2일
0

deep-dive

목록 보기
6/6

타입 변환

명시적 타입변환, 타입 캐스팅

  • 개발자가 의도적으로 값의 타입을 변환하는 것
const x = 10; // number
const str = x.toString(); // string

암묵적 타입 변환, 타입 강제 변환

  • 개발자의 의도와 상관없이 표현식을 평가하는 도중 자바스크립트 엔진에 의해 암묵적으로 타입이 자동으로 변환되는 것
const x = 10; //number
const str = x + ''; // string

명시적 타입변환, 암묵적 타입 변환 모두 기존 원시 값을 직접 변경하는 것은 아니고 기존 원시 값을 이용해 다른 타입의 새로운 원시 값을 생성하는 것이다.

이때, 변수에 다른 타입 값을 재할당 하는 것이 아닌 표현식 평가를 할 때 한번 사용하고 버린다.

암묵적 타입 변환

문자열 타입으로 변환

1 + '2' // '1' + '2' -> '12'

여기서 +는 피연산자가 문자열 하나이상을 포함하고 있기 때문에 문자열 연결 연산자로 동작한다. 문자열 연결 연산자는 모든 피연산자를 모두 문자열 타입으로 변경시키기때문에 암묵적 타입 변환한다.

숫자 타입으로 변환

1 - '1' // 0
1 * '10' // 10
1 / 'one' // NaN

여기서 사용한 연산자는 모두 산술 연산자이다. 산술연산자의 피연산자는 모두 number 타입이기때문에 피연산자를 모두 number타입으로 변환한다.

'1' > 0 // true

비교 연산자도 피연산자의 크기를 비교하므로 모든 피연산자는 숫자 타입이여야 하기때문에 number로 변환한다.

+ 단항 연산자도 숫자가 아니면 숫자 탕비으로 암묵적 타입 변환을 한다.

불리언 타입으로 변환

if ('') console.log(x);

if문 조건식은 무조건 불리언 타입이어야되기 때문에 암묵적 타입 변환한다.
이때 자바스크립트 엔진은 불리언 타입이 아닌 값을 Truthy 또는 Falsy로 구분한다.0, '', null, undefined등의 값은 Falsy한 값이기 때문에 거짓으로 분류된다.

명시적 타입 변환

문자열 타입으로 변환

  1. String 생성자 합수를 new 없이 호출하는 방법 (String())
  2. Object.prototype.toString()
  3. 문자열 연결 연산자
String(1); // '1'
true.toString() // 'true'
1 + '';

숫자 타입으로 변환

  1. Number 생성자 함수를 new 없이 호출하는ㄴ 방법 (Number())
  2. parseInt, parseFloat함수 사용 (문자열만 변환 가능)
    • 단항 산술 연산자를 이용하는 방법
    • 산술 연산자를 이용하는 방법
Number(true) // 1
parseInt('1') // 1
parseFloat('1.23') //1.23
+'0' // 0
'0' * 1 // 0

불리언 타입으로 변환

  1. Bollean 생성자 함수를 new 연산자 없이 호출하는 방법
  2. ! 부정 논리 연산자를 두 번 사용하는 방법
Boolean('x'); // true
!!'x'; // true
!!0; //false

단축 평가

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

  • 논리합 (||) 또는 논리곱 (&&)은 2개의 피연산자 중 어느 한쪽으로 평가되어 반환하기 때문에 이를 이용해 단축평가를 할 수 있다.
'Cat' && 'Dog' // 'Dog'

첫번째 피연산자인 'Cat'은 Truthy하기 때문에 true로 평가된다. 그러나&&연산자는 두개의 피연산자 모두 true여야하기 때문에 두번째 피연산자까지 평가해 보아야 위 표현식을 평가할 수 있다.
-> 두번째 피연산자가 논리곱 연산자 표현식의 평가 결과를 결정한다. 이떄 논리곱 연산자는 논리 연산의 결과를 결정하는 두 번째 피연산자. 'Dog'을 그대로 반환한다.

|| 연산자도 &&과 마찬가지로 동작한다. 다만 논리합 연산자는 맨 앞의 것으로 해당 연산자의 결과가 평가되기 때문에 첫번째 피연산자인 'Cat'을 반환한다.

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

'Cat' && 'Dog' // 'Dog'
false && 'Dog' // false
'Cat' && false // false

optional chaing (?.)

  • ES11(ECMAScript2020)에 도입된 연산자.
  • 좌황의 피연산자가 null 또는 undefined인 경우 undefined를 반환하고 그렇지 않으면 우항의 프로퍼티 참조를 이어간다.
const a = null;
const value = a?.value; // ?가 없었으면 에러가 났을 것이지만 옵셔널 체이닝의 경우 undefined를 반환하기 때문에 에러가 나지 않는다.
console.log(value); // undefined
  • optional chaing은 falsy한 값이어도 null, undefined 일때만 undefined를 반환하기때문에 그대로 우항의 프로퍼티 참조를 이어간다.
const str = '';
const length = str?.length;
console.log(length) // 0

null 병합 연산자(??)

  • ES11(ECMAScript(2020)에 도입된 연산자.
  • 좌항의 피연산자가 null 또는 undefined인 경우 우항의 피연산자를 반환하고 아닌 경우 좌항의 피연산자를 반환한다.
  • default값을 정할때 유용하다.
const foo == null ?? 'defualt' // foo === 'default'
  • optional chaning과 마찬가지로 null, undefined일 경우에만 우항의 피연산자를 반환하기때문에 그게 아니라면 좌항을 반환한다.

0개의 댓글