JS - 단락회로 평가(단축평가)

gimmicks_u·2022년 5월 21일
0

자바스크립트

목록 보기
4/5
post-thumbnail

단락회로 평가(단축평가)

short-circuit evaluation

console.log(false && true);

&&연산자의 경우 둘 다 true일 경우 true를 반환하기 때문에 첫 번째 피연산자false일 경우 뒤의 피연산자는 굳이 볼 필요가 없어 연산을 끝내버리게 된다.

이처럼 단락회로 평가는 표현식을 평가하는 도중에 평가 결과가 확정된 경우 나머지 평가 과정을 생략하는 것을 말한다.

console.log(true || false);

||연산자도 마찬가지로 두 피연산자 중 하나만 true일 경우 true를 반환하기 때문에 뒤의 연산자는 볼 필요 없이 연산이 끝나버린다.


+ 또한, 논리 연산자의 표현식의 결과는 Boolean값이 아닐 수도 있다.

console.log('Cat' && 'Dog')
console.log('Cat' || 'Dog')
Dog
Cat

위 예제에서 'Dog''Cat'는 둘 다 Truthy한 값이다. 이 경우 &&연산자는 두번째 피연산자에서 평가 결과가 결정되므로 Dog를 반환하고, ||연산자의 경우 첫번째 피연산자에서 평가 결과가 이미 결정되므로 Cat을 반환한다.

이런 단락회로 평가의 특성을 다양하게 활용할 수 있다.

활용

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

const getName = (person) => {
  if (!person) {
    return '객체가 아닙니다.';
  }
  return person.name;
};

let person;
const name = getName(person);
console.log(name);
객체가 아닙니다.

Falsy 속성을 이용해 예외를 만들어주는 예제를 사용했지만, 단락회로 평가를 사용해 코드를 더욱 간편하게 작성할 수 있다.

const getName = (person) => {
  const name = person && person.name;
  return name || '객체가 아닙니다.';
};

let person1 = { name: '홍길동' };
let person2 = null;

const name1 = getName(person1);
const name2 = getName(person2);

console.log(name1);
console.log(name2);
홍길동
객체가 아닙니다.

&&연산에서 앞의 person2 의 값이 Falsy하기 때문에 코드가 끝나 두번째 피연산자인 person.name은 실행되지 않는다. 이런 속성을 이용하여 논리 연산자를 통해 간단하게 예외처리를 할 수 있다.

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

function getStringlength(str) {
  str = str || '';
  return str.length;
}

console.log(getStringlength());
console.log(getStringlength('hi'));
0
2

함수를 호출할 때 인수를 전달하지 않으면 매개변수에는 undefined가 할당되어 위 함수의 경우 에러가 발생한다, 이 때 단락회로 평가를 사용해 매개변수의 기본값을 설정하면 에러를 방지할 수 있다.

function getStringlength(str = '') {
  return str.length;
}

번외 : ES6 매개변수의 기본값 설정

다양한 유형의 값을 선택해서 리턴해야 할 때

const getMeal = (mealType) => {
  if (mealType === '한식') return '불고기';
  if (mealType === '양식') return '파스타';
  if (mealType === '중식') return '멘보샤';
  if (mealType === '일식') return '초밥';
  return '굶기';
};

const meal = {
  한식: '불고기',
  중식: '멘보샤',
  일식: '초밥',
  양식: '스테이크',
  인도식: '카레',
};

const getMeal2 = (mealType) => {
  return meal[mealType] || '굶기';
};

console.log(getMeal2('한식'));
console.log(getMeal2('터키식'));
불고기
굶기

위의 예제처럼 다양한 값을 getMeal()함수처럼 if문을 통해 리턴할 경우 문법이 길어지고 수정이 힘들다. meal 객체를 생성 후 getMeal2()함수처럼 단락회로 평가의 특성을 활용할 경우 더욱 간결하고 수정에 용이하게 코드를 작성할 수 있다.

profile
Done is better than perfect

0개의 댓글