[모던 자바스크립트 Deep Dive] 9장. 타입 변환과 단축 평가2 (단축 평가)

2024. 3. 25. 11:26·웹 프로그래밍/JavaScript | TypeScript
반응형

9.4. 단축 평가

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

논리합(||) 또는 논리곱(&&) 연산자 표현식의 평가 결과는 불리언 값이 아닐 수도 있다.
논리합(||) 또는 논리곱(&&) 연산자 표현식은 언제나 2개의 피연산자 중 어느 한쪽으로 평가된다.
-7.5. 논리연산자 파트-


논리곱 연산자

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

논리곱 연산자는 두 개의 피연산자가 모두 true로 평가될 때 true를 반환한다. 또한 논리곱 연산자의 평가 진행 방향은 왼쪽에서 오른쪽이다.

위 예제의 경우 첫번재 피연산자 'Cat'은 Truthy 값이므로 true로 평가된다. 따라서 최종 평가 결과를 내리기 위해서는 두 번째 피연산자까지 평가해 보아야 한다. (=두 번째 피연산자가 위 예제의 평가 결과를 결정한다.) 이때 논리곱 연산자는 논리 연산의 결과를 결정하는 두 번째 피연산자('Dog')를 그대로 반환한다.

 

논리합 연산자

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

논리합 연산자는 두 피연산자 중 하나만 true로 평가되어도 true를 반환한다. 논리합 연산자 역시 평가 진행 방향이 왼쪽에서 오른쪽이다.

위 예제의 경우 첫번재 피연산자 'Cat'은 Truthy 값이므로 true로 평가되며, 이 시점에 두 번째 피연산자까지 평가해 보지 않아도 위 표현식을 평가할 수 있다. 이때 논리합 연산자는 논리 연산의 결과를 결정한 첫 번째 피연산자('Cat')를 반환한다.

 

✅ 단축평가

  • 표현식을 평가하는 도중에 평가 결과가 확정된 경우 나머지 평가 과정을 생략하는 것
  • 위의 예처럼 논리곱 연산자와 논리합 연산자가 논리 연산의 결과를 결정하는 피연산자를 타입 변환하지 않고 그대로 반환하는 일

❗❗ 단축 평가가 유용하게 사용되는 상황

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

var elem = null;
var value = elem.value; //타입에러 발생

객체를 가리키기를 기대하는 변수 값이 null 또는 undefined라면 객체의 프로퍼티를 참조할 때 타입에러가 발생한다.

이때 단축평가를 사용하면 에러가 발생하지 않는다.

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

 

2. 함수 매개변수에 기본값을 설정할 때

함수 호출 시 인수를 전달하지 않으면 매개변수에는 undefined가 할당된다. 이때 단축 평가를 사용해 매개변수의 기본값을 설정해 줄 수 있다.

//단축 평가를 사용한 매개변수의 기본값 설정
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

 

 

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

  • ES11에서 도입
  • 좌항의 피연산자가 null 또는 undefined인 경우 undefined를 반환
  • 그렇지 않으면 우항의 프로퍼티 참조를 이어간다.
var elem = null;
var value = elem?.value;
console.log(value); //undefined

옵셔널 체이닝 연산자 ?.는 객체를 가리키기를 기대하는 변수가 null 또는 undefined가 아닌지 확인하고 프로퍼티를 참조할 때 유용하다.

 

옵셔널 체이닝 연산자가 도입되기 이전에는 아래 코드처럼 논리 연산자 &&를 사용한 단축 평가를 통해 변수가 null 또는 undefined인지 확인했다.

var elem = null;

//elem가 Falsy값이면 elem으로 평가되고, elem이 Truthy 값이면 elem.value로 평가된다.
var value = elem && elem.value; 
console.log(value);  //null

논리 연산자 &&는 좌항 피연산자가 false로 평가되는 Falsy값이면 좌항 피연산자를 그대로 반환한다.

좌항 피연산자가 Falsy 값인 0이나 ''인 경우도 마찬가지다. (0이나 ''은 객체로 평가될 때도 있다.)

var str = "";

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

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

 

하지만 옵셔널 체이닝 연산자는 좌항 피연산자가 Falsy값이라도 nll 또는 undefined가 아니면 우항의 프로퍼티 참조를 이어간다.

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

 

 

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

  • ES11에서 도입
  • 좌항의 피연산자가 null 또는 undefined인 경우 우항의 피연산자를 반환
  • 그렇지 않으면 좌항의 피연산자를 반환
  • 변수에 기본값을 설정할 때 유용
var foo = null ?? "string";
console.log(foo); //string

 

null병합 연산자가 도입되기 이전에는 논리 연산자(||)를 사용한 단축 평가를 통해 변수에 기본값을 설정했다.

논리 연산자를 사용한 단축 평가의 경우 좌항의 피연산자가 Falsy값이면 우항의 피연산자를 반환한다. 

만약 Falsy 값인 0이나 ''도 기본값으로서 유효하다면 예기치 않은 동작이 발생할 수 있다.

var foo = "" || "string";
console.log(foo); //string

 

하지만 null 병합 연산자는 좌항의 피연산자가 Falsy값이라도 null 또는 undefined가 아니면 좌항의 피연산자를 그대로 반환한다.

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

 


출처: 모던 자바스크립트 Deep Dive (이웅모 저, 위키북스)

 
 
반응형
저작자표시 비영리 변경금지 (새창열림)

'웹 프로그래밍 > JavaScript | TypeScript' 카테고리의 다른 글

[모던 자바스크립트 Deep Dive] 12장. 함수1 (12.1. 함수란? ~ 12.4. 함수 정의)  (1) 2024.03.29
[모던 자바스크립트 Deep Dive] 11장. 원시 값과 객체의 비교  (0) 2024.03.27
[모던 자바스크립트 Deep Dive] 10장. 객체 리터럴  (0) 2024.03.27
[모던 자바스크립트 Deep Dive] 9장. 타입 변환과 단축 평가1 (타입 변환)  (1) 2024.03.22
[모던 자바스크립트 Deep Dive] 8장. 제어문  (1) 2024.03.22
[모던 자바스크립트 Deep Dive] 7장. 연산자  (0) 2024.03.21
'웹 프로그래밍/JavaScript | TypeScript' 카테고리의 다른 글
  • [모던 자바스크립트 Deep Dive] 11장. 원시 값과 객체의 비교
  • [모던 자바스크립트 Deep Dive] 10장. 객체 리터럴
  • [모던 자바스크립트 Deep Dive] 9장. 타입 변환과 단축 평가1 (타입 변환)
  • [모던 자바스크립트 Deep Dive] 8장. 제어문
청량리 물냉면
청량리 물냉면
프로그래밍 공부를 하고 있습니다. 공부 내용 정리 겸 정보 공유를 목적으로 합니다.
    반응형
  • 청량리 물냉면
    노력중인 블로그
    청량리 물냉면
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 프로그래밍
        • Programming
        • C | C++
        • Java
        • Python
      • 웹 프로그래밍
        • HTML | CSS
        • JavaScript | TypeScript
        • React
        • Vue.js
        • Next.js
        • Spring & Spring Boot
        • JSP & Servlet
        • DB
      • 웹 프로젝트
        • 웹 프로젝트
        • 🥨스낵몰
        • 👨‍👨‍👧‍👧소셜 가계부
        • 🌜꿈 일기장
        • 🔮포트폴리오 사이트
        • 🏃‍♂️팀 프로젝트: 일정관리 프로그램
        • 📈팀 프로젝트: AI기반 주식 분석 플랫폼
        • 😺Just Meow It: 고양이의 조언
      • 앱 프로그래밍
        • Flutter
        • Kotlin
      • Problem Solving
        • 백준
        • 프로그래머스
        • SWEA
      • Computer Science
        • 알고리즘
        • 컴퓨터 네트워크
        • 이산수학
      • Developer
        • 후기
        • 자료정리
        • 취업 | 취준
        • 웹개발 교육 프로그램
        • TIL
  • 블로그 메뉴

    • 홈
    • Github
  • 공지사항

    • 프로그래밍 공부 중😊
  • 인기 글

  • 태그

    자바
    블로그 제작
    알고리즘
    Jiraynor Programming
    mysql
    웹사이트
    클론 프로젝트
    React
    bfs
    뉴렉처
    플러터
    spring boot
    d3
    ZeroCho
    Next.js
    백준
    구현
    파이썬
    공식문서
    자바스크립트
    타입스크립트
    Til
    SWEA
    프로그래머스
    프로젝트
    강의내용정리
    컴퓨터네트워크
    포트폴리오
    리액트
    AWS
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
청량리 물냉면
[모던 자바스크립트 Deep Dive] 9장. 타입 변환과 단축 평가2 (단축 평가)
상단으로

티스토리툴바