학습 자바 스크립트와이 주어 졌을 때 아래 식 제공, 그것은 참으로 평가 발견 : transitive([1], 1, {toString:_=>'1'});
자바 스크립트 전이 평등
나는 이유를 이해하지 않습니다.
y와 z는 동일하지만 x와 z가 같지 않으면 x와 y는 어떻게 같을 수 있습니까?
function transitive(x,y,z) {
return x && x == y && y == z && x != z;
}
학습 자바 스크립트와이 주어 졌을 때 아래 식 제공, 그것은 참으로 평가 발견 : transitive([1], 1, {toString:_=>'1'});
자바 스크립트 전이 평등
나는 이유를 이해하지 않습니다.
y와 z는 동일하지만 x와 z가 같지 않으면 x와 y는 어떻게 같을 수 있습니까?
function transitive(x,y,z) {
return x && x == y && y == z && x != z;
}
JavaScript에는 "truthness"와 "falsyness"의 개념이 있습니다. 1
및 '1'
과 같은 값은 ==
과 같은 느슨한 비교 연산자와 비교할 때 동등하지만 정확히 ===
과 같은 엄격한 같음 연산자를 사용하면 동일하지 않습니다.
JavaScript는 개체를 비슷한 값으로 프리미티브로 변환하기 위해 형식 강제 변환을 사용하기 때문에 1
과 같습니다. 이것은 .toString()
이라는 객체의 메소드를 호출하여 수행합니다.이 메소드는 '1'
을 반환하며 위에서 배운 것처럼 1
과 마찬가지로 사실이므로 ==
을 사용할 때 동등한 것으로 간주됩니다.
이것은 아마도 관련성이 있습니다 : MDN: Equality comparisons and sameness.
및 !=
대신 항상 ===
및 !==
을 사용하는 것이 가장 좋으며/일반적인 방법입니다.
질문에 대답하지 않습니다. – Tushar
좀 더 직접적인 답변을 추가했습니다. 내 대답이 적절하지 않았 음을 지적 해 주셔서 감사합니다. – TW80000
@ TW80000 그래서 형 변환을 사용할 때 x와 z는 원시 적이 아니므로 동일하지 않습니다. 그러나 y가 원시 적이기 때문에 그 비교는 무엇입니까? – jcjunction
완전 항등 연산자'==='를 사용하면 값과 반대되는 형식과 값을 모두 확인할 수 있습니다. –
[작은 도구] (https://nem035.github.io/js-equality-algorithms/)를 만들었 으면 도움이 될 것입니다. 이 도구는 엔진이 실제로'=='와'==='를 어떻게 평가하는지 보여줍니다 (강제 변환을 포함하여). 그래서 당신은 정확히 무슨 일이 일어나는지 볼 수 있습니다. – nem035
@ nem035 훌륭한 도구. 평등 수표에서 일어나는 일을 이해하는 데 정말로 도움이됩니다. – jcjunction