LHJ

I'm a FE developer.

5.8.1 단축 평가

21 Apr 2020 » js_lj

AND 연산에 대한 진위표를 보면 두 값을 모두 평가하지 않아도 될 때가 있음을 알 수 잇ㅆ브니다.
x가 거짓 같은 값이면 x && y는 y의 값을 평가할 필요도 없이 false입니다.
마찬가지로 x || y 에서 x가 참 같은 값이면 y를 평가할 필요도 없이 true입니다.
자바스크립트는 정확히 이런 방식으로 동작하며, 이런 동작을 단축 평가(short-circuit evaluation) 라고 합니다.

단축 평가가 중요한 이유는 뭘까요?
두 번째 피연산자에 부수 효과(side effect) 가 있다 하더라도 단축 평가를 거치면 그 효과는 일어나지 않기 때문입니다.
부수 효과는 보통 부정적인 의미로 쓰이지만 항상 그런 건 아닙니다.
결과가 의도적이고 명확하다면 나쁘게 평가할 이유는 없습니다.

표현식에서 부수 효과는 증가, 감소, 할당, 함수 호출에서 일어날 수 있습니다.
증가와 감소 연산자는 이미 살펴봤으니 이들에 관한 예제를 봅시다.

const skipIt = true;
let x = 0;
const result = skipIt || x++;

예제의 세 번째 행의 결과는 result에 저장됩니다.
첫 번째 피연산자가 skipIt이 true이므로 result 도 true입니다.
우리가 주목할 점은, 세 번째 행에서 단축 평가가 일어나므로 증가 연산자에 해당 표현식을 실행되지 않고 x의 값은 그대로 0이라는 겁니다.
skipIt을 false로 바꾸면 논리 연산자의 두 피연산자를 모두 평가해야 하고, 따라서 x는 증가합니다.
여기서는 증가 연산이 부수 효과입니다.
AND에서도 같은 일이 일어날 수 있습니다.

const doIt = false;
let x = 0;
const result = doIt && x++;

AND의 첫 번째 피연산자가 false이므로 이번에도 자바스크립트는 두 번째 피연산자를 평가하지 않습니다.
따라서 result는 false이고, x는 늘어나지 않습니다.

doIt을 true로 바꾸면 어떻게 될까요?

자바스크립트는 두 피연산자를 모두 평가해야 하므로 증가 연산이 일어나고, result는 0이 됩니다.
잠깐, 뭐라구요?
result가 false가 아니라 0이라구요?
이 질문에 대한 답이 다음 섹션의 내용입니다.