2016-08-05 4 views
1

학습 자바 스크립트와이 주어 졌을 때 아래 식 제공, 그것은 참으로 평가 발견 : transitive([1], 1, {toString:_=>'1'});자바 스크립트 전이 평등

나는 이유를 이해하지 않습니다.

y와 z는 동일하지만 x와 z가 같지 않으면 x와 y는 어떻게 같을 수 있습니까?

function transitive(x,y,z) { 
    return x && x == y && y == z && x != z; 
} 
+2

완전 항등 연산자'==='를 사용하면 값과 반대되는 형식과 값을 모두 확인할 수 있습니다. –

+4

[작은 도구] (https://nem035.github.io/js-equality-algorithms/)를 만들었 으면 도움이 될 것입니다. 이 도구는 엔진이 실제로'=='와'==='를 어떻게 평가하는지 보여줍니다 (강제 변환을 포함하여). 그래서 당신은 정확히 무슨 일이 일어나는지 볼 수 있습니다. – nem035

+1

@ nem035 훌륭한 도구. 평등 수표에서 일어나는 일을 이해하는 데 정말로 도움이됩니다. – jcjunction

답변

-1

JavaScript에는 "truthness"와 "falsyness"의 개념이 있습니다. 1'1'과 같은 값은 ==과 같은 느슨한 비교 연산자와 비교할 때 동등하지만 정확히 ===과 같은 엄격한 같음 연산자를 사용하면 동일하지 않습니다.

JavaScript는 개체를 비슷한 값으로 프리미티브로 변환하기 위해 형식 강제 변환을 사용하기 때문에 1과 같습니다. 이것은 .toString()이라는 객체의 메소드를 호출하여 수행합니다.이 메소드는 '1'을 반환하며 위에서 배운 것처럼 1과 마찬가지로 사실이므로 ==을 사용할 때 동등한 것으로 간주됩니다.

이것은 아마도 관련성이 있습니다 : MDN: Equality comparisons and sameness.

!= 대신 항상 ===!==을 사용하는 것이 가장 좋으며/일반적인 방법입니다.

+1

질문에 대답하지 않습니다. – Tushar

+0

좀 더 직접적인 답변을 추가했습니다. 내 대답이 적절하지 않았 음을 지적 해 주셔서 감사합니다. – TW80000

+0

@ TW80000 그래서 형 변환을 사용할 때 x와 z는 원시 적이 아니므로 동일하지 않습니다. 그러나 y가 원시 적이기 때문에 그 비교는 무엇입니까? – jcjunction