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
을 반환한다.
이런 단락회로 평가의 특성을 다양하게 활용할 수 있다.
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()
함수처럼 단락회로 평가의 특성을 활용할 경우 더욱 간결하고 수정에 용이하게 코드를 작성할 수 있다.