전문 수학자로서 Javscript의 동일 연산자 ==
( "추상 비교", "느슨한 평등" 이라고도 함 )에서 엔티티 사이에 등가 관계 를 구축하려는 시도가 있습니다 . 여기에는 반사 , 대칭 및 전이가 포함 됩니다. 불행히도이 세 가지 기본 속성 중 두 개는 실패합니다.
==
재귀 하지 않습니다 :
A == A
예를 들어 거짓 일 수 있습니다.
NaN == NaN // false
==
전이 되지 않습니다 :
A == B
와 B == C
함께 의미하지는 않습니다 A == C
, 예를 들어,
'1' == 1 // true
1 == '01' // true
'1' == '01' // false
대칭 속성 만 유지됩니다.
A == B
B == A
어떤 위반이라도 생각할 수 없으며 심각한 반란을 초래할 수 있음을 암시합니다 .)
동등성 관계가 중요한 이유
그것이 가장 중요하고 널리 알려진 관계 유형이기 때문에 수많은 예제와 응용 프로그램에서 지원됩니다. 가장 중요한 응용은 엔티티를 동등성 클래스 로 분해 하는 것인데, 이는 그 자체가 관계를 이해하는 매우 편리하고 직관적 인 방법입니다. 그리고 동등성이 아닌 것은 동등성 클래스의 부족으로 이어지고, 이는 잘 알려진 직관적 성과 불필요한 복잡성의 부족으로 이어진다.
==
비동 등 관계 를 작성하는 것이 왜 그렇게 끔찍한 생각 입니까?
문자 그대로 유사성, 평등, 합동, 동 형사상, 정체성 등의 흥미로운 관계가 동등하므로 이는 우리의 친숙 함과 직관을 깨뜨리기 때문입니다.
타입 변환
JavaScript 는 직관적 인 동등성에 의존하는 대신 유형 변환을 도입합니다.
항등 연산자는 피연산자가 동일한 유형이 아닌 경우 피연산자를 변환 한 다음 엄격한 비교를 적용합니다.
그러나 유형 변환은 어떻게 정의됩니까? 수많은 예외를 포함한 복잡한 규칙 집합을 통해?
동등성 관계 구축 시도
부울. 명확 true
하고 false
동일하지 않으며 다른 클래스에 있어야합니다.
번호. 운좋게도, 숫자의 평등은 이미 잘 정의되어 있으며, 두 개의 다른 숫자는 같은 동등 클래스에 속하지 않습니다. 수학에서 그렇습니다. 자바 스크립트에서 숫자의 개념이되어 다소 변형 더 이국적인의 존재를 통해 -0
, Infinity
그리고 -Infinity
. 우리의 수학적 직관 것을 지시 0
하고 -0
(사실은 동일한 클래스에 있어야 -0 === 0
입니다 true
) 무한대의 각각 별도의 클래스 반면,.
숫자와 부울. 숫자 클래스가 주어지면 부울을 어디에 넣습니까? false
유사하게 0
, 반면 true
유사하게 1
하지만, 다른 수 :
true == 1 // true
true == 2 // false
여기에 true
합칠 논리 가 1
있습니까? 물론 1
그렇습니다 -1
. 개인적으로로 변환 true
할 이유가 없습니다 1
.
그리고 그것은 더욱 악화됩니다.
true + 2 // 3
true - 1 // 0
그래서 true
참으로 변환되는 1
모든 숫자들! 논리적입니까? 직관적입니까? 답은 운동으로 남습니다.)
그러나 이것에 대해서는 :
1 && true // true
2 && true // true
유일한 부울 x
을 가진 x && true
존재가 true
있다 x = true
. 어느 모두 증명 1
과 2
(와 이외의 다른 번호 0
)로 변환 true
! 그것이 보여주는 것은 우리의 전환이 또 다른 중요한 속성 인 실패라는 것 입니다. 두 개의 다른 엔터티가 동일한 것으로 변환 될 수 있음을 의미합니다. 그 자체만으로는 큰 문제 일 필요는 없습니다. 우리가이 변환을 사용하여 우리가 부르고 싶은 것의 "동일성"또는 "느슨한 평등"의 관계를 설명 할 때 큰 문제가 발생합니다. 그러나 한 가지 분명한 것은 동등성 관계가 아니며 동등성 클래스를 통해 직관적으로 설명되지 않는 것입니다.
그러나 우리는 더 잘할 수 있습니까?
적어도 수학적으로는-물론 그렇습니다! 논리 값 및 숫자 사이에 간단한 동치 관계는 단지로 구성 할 수 false
와 0
같은 클래스에있는. 따라서 false == 0
사소한 느슨한 평등이 될 것입니다.
문자열은 어떻습니까?
시작과 끝의 공백에서 문자열을 잘라내어 숫자로 변환 할 수 있으며 앞에있는 0을 무시할 수도 있습니다.
' 000 ' == 0 // true
' 0010 ' == 10 // true
따라서 문자열에 대한 간단한 규칙을 얻습니다. 공백과 0을 트리밍합니다. 우리는 숫자 또는 빈 문자열을 얻습니다.이 경우 해당 숫자 또는 0으로 변환됩니다. 또는 우리는 숫자를 얻지 못합니다.이 경우 우리는 변환하지 않으므로 새로운 관계를 얻지 못합니다.
이런 식으로 우리는 실제로 전체 부울, 숫자 및 문자열 집합에서 완벽한 동등 관계를 얻을 수 있습니다! 그것을 제외하고 ... JavaScript 디자이너는 분명히 다른 의견을 가지고 있습니다 :
' ' == '' // false
따라서 둘 다로 변환되는 두 줄 0
은 갑자기 비슷하지 않습니다! 왜 또는 왜? 규칙에 따르면, 문자열은 엄격하게 같을 때 정확하게 동일하지 않습니다! 이 규칙은 우리가 보는 것처럼 전이성을 깨뜨릴뿐만 아니라 중복입니다! 다른 연산자 ==
를 다른 연산자 와 엄격하게 동일하게 만들기위한 요점은 무엇입니까 ===
?
결론
느슨한 평등 연산자 ==
는 기본 수학 법칙을 준수하는 경우 매우 유용했을 수 있습니다. 그러나 슬프게도 그렇지 않아 유용성이 떨어집니다.