[JS] 단축평가(단락회로평가)
단축평가(단락회로평가)란?
단축평가(단락회로평가)는 표현식을 평가하는 도중에 평가결과가 확정된 경우, 나머지 평가 과정을 생략하는 것을 말한다. 논리연산자는 두 개의 식 중에서 좌측의 식 부터 평가한다. 좌측 식의 결과에 따라서 우측식을 판별하지 않고 넘어가는 경우가 발생한다. 이러한 판별을 단축평가(단락회로평가)라고 한다. 예제 코드를 보며 개념을 익혀보자.
console.log(false && true);
위 코드는 두 항이 모두 true일때는 true가 반환되고 하나라도 false라면 false가 반환된다. 물론 둘다 false라면 false가 반환된다. 이는 논리 AND 연산자의 특성이다. 위 코드에서 AND 연산자가 좌측 식이 true이면 우측 식도 봐야한다. 그러나 좌측 식이 이미 false이기 때문에 우측 식에 true던 false던 전체 값은 false이기 때문에 계산할 필요가 없다. 그러므로 좌측 식이 false인 위 코드와 같은 경우 좌측식에서 false로 코드 평가를 끝내버린다.
console.log(true || false);
위 코드는 논리 OR 연산자의 특성에 따라 두 항중 하나의 값이 true이면 true를 반환한다. 그래서 위 코드도 좌측 식에서 코드 평가가 끝나버린다. OR 연산자에도 단축평가가 이루어진다.
단축평가는 코드를 빨리 평가하는 기능인가?
꼭 그렇지만은 않다. 코드에 Truthy와 Falsy한 값들로 응용해서 작성하면 훨씬 간편하게 코드를 작성할 수 있다.
const getName = (person) => {
if (!person) {
return "객체가 아닙니다."
}
return person.name;
}
let person = null;
const name = getName(person);
console.log(name) /// 유정인
///논리연산자로 단축평가를 하는 코드
const getName = (person) => {
return person && person.name;
}
let person = undefined;
const name = getName(person);
console.log(name) /// 유정인
논리연산자로 person(falsy한 값) && person.name(falsy한 값) 을 비교할 때, person은 이미 undefined이기 때문에 person.name을 고려하지 않고 undefined를 반환하게 된다. 굳이 if문으로 예외사항을 처리해줘야 할 필요가 없고 코드도 간결하게 작성할 수 있다. 그러나 현재 person이 undefined이므로 undefined를 반환하고 null이라면 null을 반환한다. 그냥 falsy한 값이라고만 알고 싶은데 반환되는 값을 편하게 묶어버릴 순 없을까?
const getName = (person) => {
const name = person && person.name;
return name || "falsy한 값";
}
let person = null;
const name = getName(person);
console.log(name) /// 유정인
위와 같이 작성해주면 const name~ 부분에서 먼저 평가를 한다. 위 코드에서는 person이 null이기 때문에 name은 아래 return문에서 "falsy한 값"을 반환하게 된다.