JavaScript에는 네 가지 논리 연산자가 있습니다. ||
(OR), &&
(AND), !
(아니다), ??
(무효 병합). 여기서는 처음 세 가지인 ??
를 다룹니다. 연산자는 다음 기사에 있습니다.
"논리적"이라고 부르기는 하지만 부울뿐만 아니라 모든 유형의 값에 적용할 수 있습니다. 그 결과는 어떤 유형이든 될 수 있습니다.
세부 사항을 살펴 보겠습니다.
"OR" 연산자는 두 개의 수직선 기호로 표시됩니다.
결과 = || 비;
클래식 프로그래밍에서 논리적 OR은 부울 값만 조작하기 위한 것입니다. 인수 중 하나라도 true
이면 true
반환하고, 그렇지 않으면 false
반환합니다.
JavaScript에서 연산자는 조금 더 까다롭고 강력합니다. 하지만 먼저 부울 값을 사용하면 어떤 일이 발생하는지 살펴보겠습니다.
네 가지 가능한 논리적 조합이 있습니다.
경고( 참 || 참 ); // 진실 경고( 거짓 || 참 ); // 진실 경고( 참 || 거짓 ); // 진실 경고( 거짓 || 거짓 ); // 거짓
보시다시피, 두 피연산자가 모두 false
인 경우를 제외하고 결과는 항상 true
입니다.
피연산자가 부울이 아닌 경우 평가를 위해 부울로 변환됩니다.
예를 들어, 숫자 1
true
로 처리되고, 숫자 0
은 false
로 처리됩니다.
if (1 || 0) { // if( true || false ) 와 동일하게 작동합니다. 경고( '사실입니다!' ); }
대부분의 경우, 또는 ||
주어진 조건 중 하나라도 true
인지 테스트하기 위해 if
문에서 사용됩니다.
예를 들어:
시간 = 9로 놔두세요; if (시간 < 10 || 시간 > 18) { Alert( '사무실은 문을 닫았습니다.' ); }
더 많은 조건을 전달할 수 있습니다:
시간 = 12로 놔두세요; isWeekend = true로 설정합니다. if (시간 < 10 || 시간 > 18 || isWeekend) { Alert( '사무실은 문을 닫았습니다.' ); // 주말이에요 }
위에서 설명한 논리는 다소 고전적입니다. 이제 JavaScript의 "추가" 기능을 살펴보겠습니다.
확장된 알고리즘은 다음과 같이 작동합니다.
여러 OR'ed 값이 주어지면:
결과 = 값1 || 값2 || 값3;
OR ||
연산자는 다음을 수행합니다.
왼쪽에서 오른쪽으로 피연산자를 평가합니다.
각 피연산자에 대해 부울로 변환합니다. 결과가 true
이면 중지하고 해당 피연산자의 원래 값을 반환합니다.
모든 피연산자가 평가된 경우(즉, 모두 false
) 마지막 피연산자를 반환합니다.
값은 변환 없이 원래 형식으로 반환됩니다.
즉, OR ||
첫 번째 진실 값을 반환하거나 진실 값이 발견되지 않으면 마지막 값을 반환합니다.
예를 들어:
경고( 1 || 0 ); // 1 (1은 참) 경고( null || 1 ); // 1(1은 첫 번째 진실 값) 경고( null || 0 || 1 ); // 1(첫 번째 진실 값) 경고( 정의되지 않음 || null || 0 ); // 0 (모두 거짓, 마지막 값을 반환)
이는 "순수하고 고전적인 부울 전용 OR"에 비해 몇 가지 흥미로운 사용법으로 이어집니다.
변수 또는 표현식 목록에서 첫 번째 실제 값을 가져옵니다.
예를 들어 firstName
, lastName
및 nickName
변수가 있으며 모두 선택 사항입니다(즉, 정의되지 않거나 잘못된 값을 가질 수 있음).
OR ||
사용해 봅시다. 데이터가 있는 것을 선택하고 표시하려면(또는 아무것도 설정되지 않은 경우 "Anonymous"
):
첫 번째 이름 = ""; let lastName = ""; 닉네임 = "슈퍼코더"; Alert( firstName || lastName || nickName || "익명"); // 슈퍼코더
모든 변수가 거짓인 경우 "Anonymous"
표시됩니다.
단락 평가.
OR ||
의 또 다른 기능 연산자는 소위 "단락" 평가입니다.
그 말은 ||
첫 번째 진실 값에 도달할 때까지 인수를 처리한 다음 다른 인수를 건드리지도 않고 값이 즉시 반환됩니다.
피연산자가 단순한 값이 아니라 변수 할당이나 함수 호출과 같은 부작용이 있는 표현식인 경우 이 기능의 중요성이 분명해집니다.
아래 예에서는 두 번째 메시지만 인쇄됩니다.
사실 || Alert("인쇄되지 않음"); 거짓 || 경고("인쇄됨");
첫 번째 줄에서 OR ||
연산자는 true
확인하는 즉시 평가를 중지하므로 alert
실행되지 않습니다.
가끔 사람들은 이 기능을 사용하여 왼쪽 부분의 조건이 거짓인 경우에만 명령을 실행합니다.
AND 연산자는 두 개의 앰퍼샌드 &&
로 표시됩니다.
결과 = a && b;
클래식 프로그래밍에서 AND는 두 피연산자가 모두 참이면 true
반환하고 그렇지 않으면 false
를 반환합니다.
경고( true && true ); // 진실 경고(false && true ); // 거짓 경고( true && false ); // 거짓 경고( 거짓 && 거짓 ); // 거짓
if
의 예:
시간 = 12로 놔두세요; 분 = 30이라고 하자; if (시 == 12 && 분 == 30) { Alert( '시간은 12시 30분입니다.' ); }
OR과 마찬가지로 모든 값이 AND의 피연산자로 허용됩니다.
if (1 && 0) { // true && false로 평가됩니다. Alert( "결과가 거짓이므로 작동하지 않습니다." ); }
여러 AND'ed 값이 주어지면:
결과 = 값1 && 값2 && 값3;
AND &&
연산자는 다음을 수행합니다.
왼쪽에서 오른쪽으로 피연산자를 평가합니다.
각 피연산자에 대해 부울로 변환합니다. 결과가 false
이면 중지하고 해당 피연산자의 원래 값을 반환합니다.
모든 피연산자가 평가된 경우(즉, 모두 참인 경우) 마지막 피연산자를 반환합니다.
즉, AND는 첫 번째 거짓 값을 반환하거나 아무것도 발견되지 않은 경우 마지막 값을 반환합니다.
위의 규칙은 OR와 유사합니다. 차이점은 AND는 첫 번째 거짓 값을 반환하고 OR은 첫 번째 진실 값을 반환한다는 것입니다.
예:
// 첫 번째 피연산자가 참이면 // AND는 두 번째 피연산자를 반환합니다. 경고( 1 && 0 ); // 0 경고( 1 && 5 ); // 5 // 첫 번째 피연산자가 거짓인 경우 // 그리고 그것을 반환합니다. 두 번째 피연산자는 무시됩니다. 경고( null && 5 ); // 널 Alert( 0 && "무슨 일이 있어도" ); // 0
여러 값을 연속해서 전달할 수도 있습니다. 첫 번째 거짓이 어떻게 반환되는지 확인하세요.
경고( 1 && 2 && null && 3 ); // 널
모든 값이 진실이면 마지막 값이 반환됩니다.
경고( 1 && 2 && 3 ); // 3, 마지막
AND &&
의 우선순위가 OR ||
보다 높습니다.
AND &&
연산자의 우선순위는 OR ||
보다 높습니다. .
따라서 코드 a && b || c && d
기본적으로 &&
표현식이 괄호 안에 있는 것과 동일합니다. (a && b) || (c && d)
.
if
||
로 바꾸지 마세요. 또는 &&
때때로 사람들은 " if
작성하는 더 짧은 방법"으로 AND &&
연산자를 사용합니다.
예를 들어:
x = 1이라고 하자; (x > 0) && Alert( '0보다 큼!' );
&&
오른쪽 부분의 작업은 평가가 도달한 경우에만 실행됩니다. 즉, (x > 0)
이 참인 경우에만 해당됩니다.
따라서 기본적으로 다음과 같은 유사점이 있습니다.
x = 1이라고 하자; if (x > 0) Alert( '0보다 큼!' );
&&
있는 변형은 더 짧게 보이지만, if
가 더 명확하고 좀 더 읽기 쉬운 경향이 있습니다. 따라서 모든 구성을 해당 목적에 맞게 사용하는 것이 좋습니다. if
if
사용하고 AND를 원하면 &&
사용합니다.
부울 NOT 연산자는 느낌표 기호로 표시됩니다 !
.
구문은 매우 간단합니다.
결과 =!값;
연산자는 단일 인수를 허용하고 다음을 수행합니다.
피연산자를 부울 유형( true/false
으로 변환합니다.
역수 값을 반환합니다.
예를 들어:
경고( !true ); // 거짓 경고(!0); // 진실
이중 NOT !!
때로는 값을 부울 유형으로 변환하는 데 사용됩니다.
Alert( !!"비어있지 않은 문자열" ); // 진실 경고( !!null ); // 거짓
즉, 첫 번째 NOT은 값을 부울로 변환하고 그 반대 값을 반환하고, 두 번째 NOT은 이를 다시 반전합니다. 결국 우리는 일반 값을 부울로 변환했습니다.
동일한 작업을 수행하는 좀 더 장황한 방법이 있습니다. 바로 내장된 Boolean
함수입니다.
Alert( Boolean("비어있지 않은 문자열") ); // 진실 경고( Boolean(null) ); // 거짓
NOT !
모든 논리 연산자 중 가장 높으므로 항상 &&
또는 ||
보다 먼저 실행됩니다. .
중요도: 5
아래 코드는 무엇을 출력할까요?
경고( null || 2 || 정의되지 않음);
대답은 2
입니다. 이것이 첫 번째 진실 값입니다.
경고( null || 2 || 정의되지 않음);
중요도: 3
아래 코드는 무엇을 출력할까요?
경고( 경고(1) || 2 || 경고(3) );
대답: 처음에는 1
, 그다음에는 2
.
경고( 경고(1) || 2 || 경고(3) );
alert
호출은 값을 반환하지 않습니다. 즉, undefined
을 반환합니다.
첫 번째 OR ||
왼쪽 피연산자 alert(1)
평가합니다. 1
의 첫 번째 메시지가 표시됩니다.
alert
는 undefined
반환하므로 OR은 진실한 값을 검색하는 두 번째 피연산자로 이동합니다.
두 번째 피연산자 2
진실이므로 실행이 중단되고 2
반환된 후 외부 경고에 표시됩니다.
평가가 alert(3)
에 도달하지 않기 때문에 3
없습니다.
중요도: 5
이 코드는 무엇을 보여줄까요?
경고( 1 && null && 2 );
답은 null
입니다. 목록의 첫 번째 거짓 값이기 때문입니다.
경고(1 && null && 2);
중요도: 3
이 코드는 무엇을 보여줄까요?
경고(경고(1) && 경고(2) );
답은 1
이고 그 다음은 undefined
.
경고(경고(1) && 경고(2) );
alert
호출은 undefined
을 반환합니다(단지 메시지만 표시하므로 의미 있는 반환이 없습니다).
따라서 &&
왼쪽 피연산자(출력 1
)를 평가하고 즉시 중지합니다. 왜냐하면 undefined
는 잘못된 값이기 때문입니다. 그리고 &&
잘못된 값을 찾아서 반환하므로 완료됩니다.
중요도: 5
결과는 어떻게 될까요?
경고( null || 2 && 3 || 4 );
대답: 3
.
경고( null || 2 && 3 || 4 );
AND &&
의 우선순위는 ||
보다 높습니다. 이므로 먼저 실행됩니다.
2 && 3 = 3
의 결과이므로 표현식은 다음과 같습니다.
널 || 3 || 4
이제 결과는 첫 번째 진실 값인 3
입니다.
중요도: 3
age
14
에서 90
사이인지 확인하는 if
조건을 작성하세요.
"포함적으로"는 age
14
또는 90
에 도달할 수 있음을 의미합니다.
if (나이 >= 14 && 나이 <= 90)
중요도: 3
age
14
에서 90
사이가 아닌지 확인하는 if
조건을 작성하세요.
두 가지 변형을 만듭니다. 첫 번째 변형은 NOT 을 사용합니다 !
, 두 번째 – 그것 없이.
첫 번째 변형:
if (!(나이 >= 14 && 나이 <= 90))
두 번째 변형:
if (나이 < 14 || 나이 > 90)
중요도: 5
다음 중 어떤 alert
가 실행되나요?
if(...)
안에 표현식의 결과는 무엇입니까?
if (-1 || 0) 경고( '첫 번째' ); if (-1 && 0) 경고( '두 번째' ); if (null || -1 && 1) Alert( '세 번째' );
대답: 첫 번째와 세 번째가 실행됩니다.
세부:
// 실행됩니다. // -1의 결과 || 0 = -1, 진실함 if (-1 || 0) 경고( '첫 번째' ); // 실행되지 않음 // -1 && 0 = 0, 거짓 if (-1 && 0) 경고( '두 번째' ); // 실행 // 연산자 &&는 ||보다 우선순위가 높습니다. // 따라서 -1 && 1이 먼저 실행되어 체인이 제공됩니다. // 널 || -1 && 1 -> null || 1 -> 1 if (null || -1 && 1) Alert( '세 번째' );
중요도: 3
prompt
사용하여 로그인을 요청하는 코드를 작성합니다.
방문자가 "Admin"
입력하면 비밀번호를 입력하라는 prompt
되고 입력이 빈 줄이면 Esc – “취소됨”이 표시되고 다른 문자열이면 “나는 당신을 모릅니다”가 표시됩니다.
비밀번호는 다음과 같이 확인됩니다.
"TheMaster"와 같으면 "Welcome!"을 표시하고,
또 다른 문자열 - "잘못된 비밀번호" 표시,
빈 문자열 또는 취소된 입력의 경우 "Canceled"를 표시합니다.
스키마:
중첩된 if
블록을 사용하세요. 코드의 전반적인 가독성에 유의하세요.
힌트: 빈 입력을 프롬프트에 전달하면 빈 문자열 ''
이 반환됩니다. 프롬프트가 표시되는 동안 ESC를 누르면 null
반환됩니다.
데모 실행
let userName = 프롬프트("거기 누구세요?", ''); if (사용자 이름 === '관리자') { let pass = 프롬프트('비밀번호?', ''); if (pass === 'TheMaster') { Alert( '환영합니다!' ); } else if (pass === '' || pass === null) { 경고( '취소됨' ); } 또 다른 { 경고( '잘못된 비밀번호' ); } } else if (사용자 이름 === '' || 사용자 이름 === null) { 경고( '취소됨' ); } 또 다른 { Alert( "나는 당신을 모른다" ); }
if
블록 내부의 세로 들여쓰기를 확인하세요. 기술적으로는 필수는 아니지만 코드를 더 읽기 쉽게 만듭니다.