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 블록 내부의 세로 들여쓰기를 확인하세요. 기술적으로는 필수는 아니지만 코드를 더 읽기 쉽게 만듭니다.