2014-05-01 2 views
5

오래 전에 나는왜 자바 비교 연산자가 수학적으로 일치하지 않습니까? 수학 수업에서

== B를 는 경우에만 < = B와 b <과은을 = 경우에 것을 배웠습니다.

자바 스크립트가 그렇게 생각하지 않는 것 :

> new Date(400) <= new Date(400) 
true 
> new Date(400) >= new Date(400) 
true 
> new Date(400) == new Date(400) 
false 

누군가가이 결과로 이어질 유형 강제 변환 규칙을 설명 할 수 있습니까? 연산자 ==과 같은 퍼지는 두 개의 Date이 동일한 값을 가지고 있다고 생각해야합니다.

+3

두 개의 날짜가 서로 다른 두 개체입니다. 수학이 적용되지 않습니다. 특별히 연산자가 아니고 혼동하지 마십시오. 규칙이 다릅니다. 어떤 경우에는 날짜가 문자열 화됩니다. – elclanrs

답변

3

첫째의 당신이 비교하는 것을 시작하자 :

typeof new Date(400) 
"object" 

자바 스크립트 객체는 처음 두 경우의 값을 비교하는 방법 .valueOf()를 사용합니다. 일반 개체는 기본적으로 서로를 비교하는 방법을 모르며 "[object Object]" 문자열을 사용합니다. 날짜는 다른 한편으로는 방법을 안다.

new Date(400) <= new Date(400) 
new Date(400).valueOf() <= new Date(400).valueOf() 
400 <= 400 
true 

가 그러나, 마지막 동작은 다른 개체에 대해 정의되며, 이는 비교 두 개체 (되지 상기 정수)는 그들 모두가 별도로 새로운 객체를 만들지 않을 것 같은 참조를, 있다면 . 첫 번째 두 개의 유사한 방식으로 날짜 값을 비교하려면

new Date(400) == new Date(400) 
false 

대신 특별히 .valueOf()를 호출해야합니다.

new Date(400).valueOf() == new Date(400).valueOf() 
true 
+0

당신의 추론이 정확하지 않은 것 같습니다 :'new Date (400)> = new Date (401)':'false'. –

+1

@AndrewMao 고마워, 나는 내 머리 꼭대기에서 답을 썼다. 지금 당장 체크해보고 내가 잘못한 곳을 발견했다. – Nit

1

모질라의 documentation==에 대한 자바 스크립트 확인의 NIT의 문에서 비교 연산자에 대한 유형 Object의 변수에 정의 된 바와 같다. 두 피연산자 개체 경우

후 JavaScript는 피연산자 메모리에 동일한 오브젝트를 참조 할 때 동일한 참조 내부를 비교한다.

이 특별 참고는 ==!= 연산자에 대해서만 작성되었습니다. 즉, >=<= 연산자의 경우 내부 참조가 아닌 개체 자체가 비교됩니다.

자연 문제는 어떻게 비교는 두 Date 개체에 대해 (<<=>, >=가) 정의? 이에 대한 참조를 찾을 수 없었으므로이 질문에 대답하기 위해 일부 소스 코드를 살펴 봐야 할 수도 있습니다.

관련 문제