우리는 수학에서 많은 비교 연산자를 알고 있습니다.
JavaScript에서는 다음과 같이 작성됩니다.
보다 큼/보다 작음: a > b
, a < b
.
크거나 작거나 같음: a >= b
, a <= b
.
같음: a == b
, 이중 등호 ==
동일성 테스트를 의미하고 단일 a = b
할당을 의미합니다.
같지 않음: 수학에서 표기법은 ≠
이지만 JavaScript에서는 a != b
로 작성됩니다.
이 기사에서 우리는 다양한 유형의 비교, 중요한 특징을 포함하여 JavaScript가 비교를 수행하는 방법에 대해 자세히 알아볼 것입니다.
마지막에는 "JavaScript 문제" 관련 문제를 방지할 수 있는 좋은 방법을 찾을 수 있습니다.
모든 비교 연산자는 부울 값을 반환합니다.
true
– "예", "올바른" 또는 "진실"을 의미합니다.
false
– “아니오”, “틀림” 또는 “진실이 아님”을 의미합니다.
예를 들어:
경고( 2 > 1 ); // 참(맞음) 경고( 2 == 1 ); // 거짓(틀림) 경고( 2 != 1 ); // 참(맞음)
다른 값과 마찬가지로 비교 결과를 변수에 할당할 수 있습니다.
결과 = 5 > 4로 둡니다. // 비교 결과 할당 경고(결과); // 진실
문자열이 다른 문자열보다 큰지 확인하기 위해 JavaScript는 소위 "사전" 또는 "사전순" 순서를 사용합니다.
즉, 문자열은 문자별로 비교됩니다.
예를 들어:
경고( 'Z' > 'A' ); // 진실 경고( '발광' > '글리' ); // 진실 경고( '벌' > '비' ); // 진실
두 문자열을 비교하는 알고리즘은 간단합니다.
두 문자열의 첫 번째 문자를 비교합니다.
첫 번째 문자열의 첫 번째 문자가 다른 문자열보다 크거나 작으면 첫 번째 문자열이 두 번째 문자열보다 크거나 작습니다. 이제 끝났습니다.
그렇지 않고 두 문자열의 첫 번째 문자가 동일한 경우 두 번째 문자를 같은 방식으로 비교합니다.
두 문자열 중 하나가 끝날 때까지 반복합니다.
두 문자열이 같은 길이로 끝나면 두 문자열은 같습니다. 그렇지 않으면 긴 문자열이 더 큽니다.
위의 첫 번째 예에서 'Z' > 'A'
비교는 첫 번째 단계에서 결과를 얻습니다.
두 번째 비교 'Glow'
와 'Glee'
는 문자열이 문자별로 비교되므로 더 많은 단계가 필요합니다.
G
G
와 동일합니다.
l
l
과 동일합니다.
o
e
보다 크다. 여기서 멈춰라. 첫 번째 문자열이 더 큽니다.
실제 사전은 아니지만 유니코드 순서
위에 제시된 비교 알고리즘은 사전이나 전화번호부에서 사용되는 것과 대략 동일하지만 완전히 동일하지는 않습니다.
예를 들어 사건이 중요합니다. 대문자 "A"
는 소문자 "a"
와 동일하지 않습니다. 어느 것이 더 큽니까? 소문자 "a"
. 왜? 왜냐하면 소문자는 JavaScript가 사용하는 내부 인코딩 테이블(유니코드)에서 더 큰 인덱스를 갖기 때문입니다. 우리는 문자열 장에서 이에 대한 구체적인 세부 사항과 결과를 다시 다루겠습니다.
다양한 유형의 값을 비교할 때 JavaScript는 값을 숫자로 변환합니다.
예를 들어:
경고( '2' > 1 ); // true, 문자열 '2'는 숫자 2가 됩니다. 경고( '01' == 1 ); // true, 문자열 '01'은 숫자 1이 됩니다.
부울 값의 경우 true
1
이 되고 false
0
이 됩니다.
예를 들어:
경고( true == 1 ); // 진실 경고( false == 0 ); // 진실
재미있는 결과
동시에 다음이 가능합니다.
두 값이 동일합니다.
그 중 하나는 부울로서 true
이고 다른 하나는 부울로서 false
입니다.
예를 들어:
a = 0이라고 하자; 경고( Boolean(a) ); // 거짓 b = "0"이라고 하자; 경고( 부울(b) ); // 진실 경고(a == b); // 진실!
JavaScript의 관점에서 볼 때 이 결과는 매우 정상적입니다. 동등성 검사는 숫자 변환을 사용하여 값을 변환하는 반면(따라서 "0"
은 0
이 됨) 명시 Boolean
변환은 다른 규칙 세트를 사용합니다.
정기적인 동등성 검사 ==
에 문제가 있습니다. 0
과 false
구별할 수 없습니다.
경고( 0 == false ); // 진실
빈 문자열에서도 같은 일이 발생합니다.
경고( '' == false ); // 진실
이는 서로 다른 유형의 피연산자가 같음 연산자 ==
에 의해 숫자로 변환되기 때문에 발생합니다. false
와 마찬가지로 빈 문자열은 0이 됩니다.
0
과 false
구별하려면 어떻게 해야 하나요?
엄격한 항등 연산자 ===
는 유형 변환 없이 동일성을 확인합니다.
즉, a
와 b
의 유형이 다른 경우 a === b
변환을 시도하지 않고 즉시 false
반환합니다.
시도해 봅시다:
경고( 0 === 거짓 ); // false입니다. 유형이 다르기 때문입니다.
!=
와 유사한 "엄격한 비동등" 연산자 !==
도 있습니다.
엄격한 항등 연산자는 작성하는 데 조금 더 길지만 무슨 일이 일어나고 있는지 명확하게 보여주고 오류가 발생할 여지가 적습니다.
null
또는 undefined
다른 값과 비교할 때 직관적이지 않은 동작이 있습니다.
엄격한 평등 검사를 위해 ===
이 값은 각각 다른 유형이기 때문에 다릅니다.
경고( null === 정의되지 않음); // 거짓
엄격하지 않은 검사의 경우 ==
특별한 규칙이 있습니다. 이 둘은 "달콤한 커플"입니다. 즉, ==
의미에서 서로 동일하지만 다른 값은 아닙니다.
경고( null == 정의되지 않음); // 진실
수학 및 기타 비교의 경우 < > <= >=
null/undefined
은 숫자로 변환됩니다. null
0
이 되고, undefined
는 NaN
됩니다.
이제 이러한 규칙을 적용할 때 발생하는 몇 가지 재미있는 일을 살펴보겠습니다. 그리고 더 중요한 것은 그들과 함께 함정에 빠지지 않는 방법입니다.
null
0과 비교해 보겠습니다.
경고( null > 0 ); // (1) 거짓 경고( null == 0 ); // (2) 거짓 경고( null >= 0 ); // (3) 참
수학적으로는 이상합니다. 마지막 결과는 " null
은 0보다 크거나 같습니다"라고 명시하므로 위의 비교 중 하나에서는 true
여야 하지만 둘 다 false입니다.
그 이유는 동등성 검사 ==
와 비교 > < >= <=
다르게 작동하기 때문입니다. 비교는 null
숫자로 변환하여 0
으로 처리합니다. 이것이 (3) null >= 0
이 참이고 (1) null > 0
이 거짓인 이유입니다.
반면, undefined
및 null
에 대한 동등 검사 ==
변환 없이 서로 동일하고 다른 어떤 것과도 동일하지 않도록 정의됩니다. 이것이 (2) null == 0
이 거짓인 이유입니다.
undefined
값은 다른 값과 비교하면 안 됩니다.
경고( 정의되지 않음 > 0 ); // 거짓 (1) 경고(정의되지 않음 < 0 ); // 거짓 (2) 경고( 정의되지 않음 == 0 ); // 거짓 (3)
왜 제로를 그토록 싫어하는 걸까요? 항상 거짓!
이러한 결과를 얻는 이유는 다음과 같습니다.
undefined
값은 NaN
으로 변환되고 NaN
모든 비교에 대해 false
반환하는 특수 숫자 값이기 때문에 비교 (1)
과 (2)
false
반환합니다.
동일성 검사 (3)
는 false
반환합니다. 왜냐하면 undefined
null
, undefined
과 같고 다른 값은 동일하지 않기 때문입니다.
우리가 이러한 예를 검토한 이유는 무엇입니까? 우리는 이러한 특징을 항상 기억해야 할까요? 글쎄요, 그렇지 않아요. 실제로 이러한 까다로운 사항은 시간이 지남에 따라 점차 익숙해지지만 이러한 문제를 피할 수 있는 확실한 방법이 있습니다.
엄격한 동등성 ===
제외하고 undefined/null
과의 비교를 각별히 주의하여 처리하십시오.
현재 수행 중인 작업이 확실하지 않은 한 null/undefined
일 수 있는 변수에 대해 비교 >= > < <=
사용하지 마세요. 변수에 이러한 값이 있을 수 있으면 별도로 확인하세요.
비교 연산자는 부울 값을 반환합니다.
문자열은 "사전" 순서에 따라 문자별로 비교됩니다.
서로 다른 유형의 값을 비교할 때 숫자로 변환됩니다(엄격한 동일성 검사 제외).
null
값과 undefined
값은 서로 ==
같으며 다른 값은 같지 않습니다.
때때로 null/undefined
일 수 있는 변수에 >
또는 <
같은 비교를 사용할 때는 주의하세요. null/undefined
별도로 확인하는 것이 좋습니다.
중요도: 5
이 표현의 결과는 무엇입니까?
5 > 4 "사과" > "파인애플" "2" > "12" 정의되지 않음 == null 정의되지 않음 === null null == "n0n" null === +"n0n"
5 > 4 → 참 "사과" > "파인애플" → 거짓 "2" > "12" → 참 정의되지 않음 == null → true 정의되지 않음 === null → false null == "n0n" → 거짓 null === +"n0n" → 거짓
몇 가지 이유는 다음과 같습니다.
분명히 사실입니다.
사전 비교이므로 거짓입니다. "a"
"p"
보다 작습니다.
다시 말하지만, 사전 비교에서는 첫 번째 문자 "2"
가 첫 번째 문자 "1"
보다 큽니다.
null
값과 undefined
서로만 동일합니다.
엄격한 평등은 엄격합니다. 양쪽의 유형이 다르면 거짓이 발생합니다.
(4)
와 마찬가지로 null
undefined
와 동일합니다.
다양한 유형의 엄격한 평등.