IT TIP

JavaScript는 왜 비교 연산자보다 크거나 작을까요?

itqueen 2021. 1. 8. 22:37
반응형

JavaScript는 왜 비교 연산자보다 크거나 작을까요?


JavaScript의 유형 엄격한 비교 연산자 ( ===, !==)는 좋지만보다 크거나 작은 것에 대한 해당 엄격한 비교가 없습니다.

var x = 10;

x <= 20;    // true
x <= '20';    // true
x <== 20;   // true (or would be, if JS had such an operator)
x <== '20'; // false (ditto)

왜 안돼? 나는이 질문에 "어, 그렇지 않기 때문에"라고 대답 할 것을 충분히 기대하고 있지만, 어쨌든 그러한 연산자가 생략되는 흥미 롭거나 낙담 한 역사적 이유가있는 경우를 대비하여 질문하고 있습니다.


추측 만 할 수 있습니다.

경우
a === b거짓, 다음
a !== b사실이다. 항상 .

그러나이 의미는 <==


x <== 20거짓 인 경우 x >== 20유형 검사 또는 관계 검사로 인해 거짓 일 수 있으므로 결과를 추론 할 수 없습니다 .

나는 이제 생각 약간 (한 가지 이름을 일반적으로 강제 형 변환) 훨씬 더있는 언어로 많은 물건이있다하더라도, 혼란.

그러나 나는 엄격 <하거나 >일관되게 행동 할 것이라고 생각합니다 .


a === b는의 속기 이므로 typeof a == typeof b && a == b부등식에이 확장을 사용할 수 있습니다 typeof a == typeof b && a <= b.


질문에 대한 답이 있는지 잘 모르겠습니다. 내 생각에, 의도 된 용도는 숫자를 문자열 (및 부울)과 비교하는 것입니다. 엄격하지 않은 같음 연산자가하는 것처럼 실제로 이러한 경우에 작동합니다. 그 밖의 모든 것은 어쨌든 임의의 유형 강제 규칙의 적용을받습니다. "올바른"출력은 [] < {}무엇입니까? false? 어쩌면 undefined? 유형이 다를 필요 ({foo: 1}) < {bar : 2}도없고 의미도 없습니다.

제 생각에 그들은 (Brendan Eich와 나중에 ECMAScript위원회) 개발자들이 비교가 합리적 일 것이라고 믿기로 결정했습니다. 또는 개발자가 미친 비교를 시도 할 것이라고 생각조차하지 않았습니다. 비교를 위해 추가 연산자를 만들면 언어가 복잡해집니다. 그리고 유형 강제를 다룰 때 비교가 유일한 함정이 아니라는 것을 잊지 마십시오. 덧셈, 뺄셈 등도 있습니다. 그래서 나는 그들이 서로 다른 유형 간의 연산을 허용하는 결정에 진실로 결정했다고 생각합니다. 그들은 그들이 무엇을하고 있는지 알면 사람들에게 도움이 될 것이라고 생각했지만 아마도 그로 인해 발생하는 모든 혼란을 예상하지 못했을 것입니다.


그것을 갖는 것이 말이되지 않는 이유를 보여주기 위해 대신 고려해보십시오.

var x = 10
var less = (x <= 5)

자, 둘 다

x <== 5

x <== '5'

거짓이지만 다른 이유가 있습니다. 첫 번째 경우 x> 5라는 가정을 사용할 수 있지만 후자의 경우에는 사용할 수 없습니다. 잘못된 가정을 피하려면 먼저 === 또는! ==를 사용한 다음 이후에 비교하는 것이 좋습니다.


문제는 엄격한 동등성이 서로 다른 유형에 대해 잘 정의 될 수 있지만 (동일 유형이 아니라 같지 않음) 관계 연산자가 서로 다른 유형에 대해 잘 정의 될 수 없다는 것입니다.

엄격한 비교기 a <== b를로 정의한다고 가정 합니다 typeof a == typeof b && a <= b. 그리고 a >== b. 그런 다음 a = "3"과 b = 3을 비교하고 결과는 a <== b거짓, a >== b거짓 및 a === b거짓입니다. 축하합니다. 방금 역설을 만들었습니다!

이러한 엄격한 비교기는 알고리즘 정렬 또는 예상치 못한 값 비교와 같은 것을 여전히 엉망으로 만듭니다. 예를 들면 :

for (var i; i <== list.count; i++) {
  doStuff(i);
}

이 예제는 list.count대신 실수로를 사용 하고 있으며 list.length, 이는를 반환하고 undefined,와 비교할 때 false를 반환 i <== undefined하므로 프로그래머가 놀랍게도 for 루프를 완전히 건너 뛸 수 있습니다.

JavaScript list.count가 정의되지 않은 속성 대해 오류를 발생시키고 다른 유형을 비교하는 경우에도 훨씬 나을 것 입니다.

그게 내가 말할 수있는 전부입니다. 유형을 비교하면 다른 괜찮은 언어와 마찬가지로 예외가 발생해야합니다. 하지만 그렇지 않습니다.

즉, 실제 실용적인 해결책은 전 처리기 사용을 시작하거나 "잘해"라고 말하고 JavaScript를 계속 입력하는 것입니다. ¯\_(ツ)_/¯

참조 URL : https://stackoverflow.com/questions/14533046/why-doesnt-javascript-have-strict-greater-less-than-comparison-operators

반응형