JavaScript의 논리 연산자에는 여타 언어와 같이 AND(&&)
, OR(||)
, NOT(!)
이 존재한다.
이들의 기본적인 용법은 다른 언어와 거의 동일하다.
이 글에서는 short circuit evaluation에 대해서만 다루도록 하겠다.
Short-Circuit Evaluation
Short-Circuit Evaluation - 단락 평가(단축 평가)
JavaScript의 AND, OR 연산에서는 앞의 조건(피연산자)의 값에 따라 뒤의 조건(피연산자)의 값을 고려(평가, 실행)하지 않는다.
이러한 방식을 short-circuit evaluation이라고 한다.
반대로 앞의 피연산자에 따라 연산의 결과가 결정되는지에 상관없이 모든 피연산자를 고려하는 방식을 eager evaluation 이라고 한다.
f1() || f2() || f3()
function f1() {
console.log("function 1");
return true;
}
function f2() {
console.log("function 2");
return true;
}
function f3() {
console.log("function 3");
return true;
}
// output :
// function 1
위의 예시를 보면 이해가 쉽게 될 것이다.
line 1의 f1() || f2() || f3()
에서 왼쪽부터 연산이 시작되는데, f1()
의 return값이 true
이므로 f2(), f3()
의 return값과 관계없이 연산은 이미 true
이다.
따라서, f2()
와 f3()
을 무시하는 것을 확인할 수 있다.
물론, OR연산이 아닌 AND연산에서도 같은 방식으로 작동한다.
f1() && f2() && f3();
function f1() {
console.log("function 1");
return true;
}
function f2() {
console.log("function 2");
return false;
}
function f3() {
console.log("function 3");
return true;
}
// output :
// function 1
// function 2
똑같이 line 1에서 왼쪽부터 연산이 시작되고, f2()
의 return값이 false
이므로 전체 연산 결과가 false
로 확정되어 f3()
이 무시되는 것을 확인할 수 있다.
이 방식을 JavaScript가 아닌 다른 언어들에서도 채택하고 있는 것을 찾아볼 수 있다.
예를 들면, Python, Java, C++과 같은 언어에서는 eager evaluation과 short-circuit evaluation을 모두 채택하여 eager operator와 short-circuit operator가 모두 존재한다.
C++은 JavaScript와 동일하게 short-circuit evaluation만 존재한다.
Eager Operator Short-Circuit Operator Python &, | and, or Java, C# &, | &&, || JavaScript, C++ &&, ||
응용 - 첫 번째 truthy / falsy 판별
이러한 특성을 이용해서, 변수들 중 값이 들어있는 변수를 찾을 수 있다.
let value1 = "";
let value2 = "";
let value3 = "value3";
let result = value1 || value2 || value3 || "DATA_NOT_EXIST";
console.log(result);
// output :
// value3
""
는 falsy 이므로 value1
과 value2
는 연산에서 false로 변환되므로, 첫 번째로 truthy 값이 존재하는 value3
가 result에 저장된다.
이런 식으로 여러 변수들 중에서 값이 실재하는 변수를 찾아내는 데 이용할 수 있다.
물론, AND 연산자를 이용하면 반대로 첫 번째 falsy를 찾아 값이 실재하지 않는 변수를 찾는 데 이용할 수 있다.
let value1 = "value1";
let value2 = "value2";
let value3 = null;
let result = value1 && value2 && value3 && "ALL_DATA_EXIST";
console.log(result);
// output :
// null