--- title: 논리 연산자 slug: >- conflicting/Web/JavaScript/Reference/Operators_13aeb53e31f9cec454ca631cb162449f tags: - JavaScript - Logic - Not - Operator - Reference - and - or - 논리 translation_of: Web/JavaScript/Reference/Operators translation_of_original: Web/JavaScript/Reference/Operators/Logical_Operators original_slug: Web/JavaScript/Reference/Operators/논리_연산자(Logical_Operators) ---
논리 연산자는 보통 {{jsxref("Boolean")}}(논리적) 값과 함께 쓰이며, 불리언 값을 반환합니다. 그런데, &&
과 ||
연산자는 사실 피연산자 중 하나의 값을 반환합니다. 그러므로 불리언 외의 다른 값과 함께 사용하면 불리언 값이 아닌 것을 반환할 수 있습니다.
다음 표는 논리 연산자의 종류입니다. (expr
은 불리언을 포함해서 아무 자료형이나 가능합니다)
연산자 | 구문 | 설명 |
---|---|---|
논리 AND (&& ) |
expr1 && expr2 |
expr1 을 true로 변환할 수 있는 경우 expr2 을 반환하고, 그렇지 않으면 expr1 을 반환합니다. |
논리 OR (|| ) |
expr1 || expr2 |
|
논리 NOT (! ) |
!expr |
단일 피연산자를 true 로 변환할 수 있으면 false 를 반환합니다. 그렇지 않으면 true 를 반환합니다. |
값을 true
로 변환하면 값이 {{Glossary("truthy", "참")}}인 것입니다.
값을 false
로 변환할 수 있으면 값이 {{Glossary("falsy", "거짓")}}인 것입니다.
거짓으로 변환할 수 있는 표현의 예는 다음과 같습니다.
null
NaN
0
"",
''
, ``
)undefined
&&
연산자와 ||
연산자를 불리언 값이 아닌 피연산자와 함께 사용될 수 있지만, 반환 값을 항상 불리언 원시값으로 변환할 수 있으므로 불리언 연산자로 생각할 수 있습니다. 반환 값을 직접 불리언으로 바꾸려면 {{jsxref("Boolean")}} 함수나 이중 부정 연산자를 사용하세요.
논리 표현식을 좌측부터 평가하므로, 아래 규칙에 따라 단락(short-circuit) 평가를 수행합니다.
(거짓 표현식) && expr
은 거짓 표현식으로 단락 평가됩니다.(참 표현식) || expr
은 참 표현식으로 단락 평가됩니다."단락"이란, 위 규칙에서 expr
을 평가하지 않는다는 뜻입니다. 따라서 평가 중 발생해야 할 부작용(예: expr
이 함수 호출이면 절대 호출하지 않음)도 나타나지 않습니다. 단락 평가가 발생하는 원인은 첫 번째 피연산자를 평가한 순간 이미 연산자의 결과가 정해지기 때문입니다. 다음 예제를 살펴보세요.
function A(){ console.log('A 호출'); return false; } function B(){ console.log('B 호출'); return true; } console.log( A() && B() ); // 함수 호출로 인해 콘솔에 "A 호출" 기록 // 그 후 연산자의 결과값인 "false" 기록 console.log( B() || A() ); // 함수 호출로 인해 콘솔에 "B 호출" 기록 // 그 후 연산자의 결과인 "true" 기록
다음 두 식은 똑같아 보이지만, &&
연산자는 ||
이전에 실행되므로 서로 다릅니다. 연산자 우선순위를 참고하세요.
true || false && false // returns true, because && is executed first (true || false) && false // returns false, because operator precedence cannot apply
&&
)다음은 &&
(논리 AND) 연산자의 예제입니다.
a1 = true && true // t && t returns true a2 = true && false // t && f returns false a3 = false && true // f && t returns false a4 = false && (3 == 4) // f && f returns false a5 = 'Cat' && 'Dog' // t && t returns "Dog" a6 = false && 'Cat' // f && t returns false a7 = 'Cat' && false // t && f returns false a8 = '' && false // f && f returns "" a9 = false && '' // f && f returns false
||
)다음은 ||
(논리 OR) 연산자의 예제입니다.
o1 = true || true // t || t returns true o2 = false || true // f || t returns true o3 = true || false // t || f returns true o4 = false || (3 == 4) // f || f returns false o5 = 'Cat' || 'Dog' // t || t returns "Cat" o6 = false || 'Cat' // f || t returns "Cat" o7 = 'Cat' || false // t || f returns "Cat" o8 = '' || false // f || f returns false o9 = false || '' // f || f returns "" o10 = false || varObject // f || object returns varObject
!
)다음은 !
(논리 NOT) 연산자의 예제입니다.
n1 = !true // !t returns false n2 = !false // !f returns true n3 = !'' // !f returns true n4 = !'Cat' // !t returns false
!!
)NOT 연산자 다수를 연속해서 사용하면 아무 값이나 불리언 원시값으로 강제 변환할 수 있습니다. 변환 결과는 피연산자 값의 "참스러움"이나 "거짓스러움"에 따릅니다. ({{Glossary("truthy", "참")}}과 {{Glossary("falsy", "거짓")}}을 참고하세요)
동일한 변환을 {{jsxref("Boolean")}} 함수로도 수행할 수 있습니다.
n1 = !!true // !!truthy returns true n2 = !!{} // !!truthy returns true: any object is truthy... n3 = !!(new Boolean(false)) // ...even Boolean objects with a false .valueOf()! n4 = !!false // !!falsy returns false n5 = !!"" // !!falsy returns false n6 = !!Boolean(false) // !!falsy returns false
불리언 계산에서, 다음 두 코드는 항상 같습니다.
bCondition1 && bCondition2
!(!bCondition1 || !bCondition2)
불리언 계산에서, 다음 두 코드는 항상 같습니다.
bCondition1 || bCondition2
!(!bCondition1 && !bCondition2)
불리언 계산에서, 다음 두 코드는 항상 같습니다.
!!bCondition
bCondition
논리 표현식은 항상 왼쪽에서 오른쪽으로 평가되므로, 몇 가지 규칙을 따르면 복잡한 표현식에서 괄호를 제거할 수 있습니다.
불리언의 합성 계산에서, 다음 두 코드는 항상 같습니다.
bCondition1 || (bCondition2 && bCondition3)
bCondition1 || bCondition2 && bCondition3
불리언의 합성 계산에서, 다음 두 코드는 항상 같습니다.
bCondition1 && (bCondition2 || bCondition3)
!(!bCondition1 || !bCondition2 && !bCondition3)
Specification | Status | Comment |
---|---|---|
{{SpecName('ES1')}} | {{Spec2('ES1')}} | Initial definition. |
{{SpecName('ES5.1', '#sec-11.11')}} | {{Spec2('ES5.1')}} | Defined in several sections of the specification: Logical NOT Operator, Binary Logical Operators |
{{SpecName('ES6', '#sec-binary-logical-operators')}} | {{Spec2('ES6')}} | Defined in several sections of the specification: Logical NOT Operator, Binary Logical Operators |
{{SpecName('ESDraft', '#sec-binary-logical-operators')}} | {{Spec2('ESDraft')}} | Defined in several sections of the specification: Logical NOT Operator, Binary Logical Operators |
{{Compat("javascript.operators.logical")}}