2016-08-05 12 views
1

Learning JavaScript und stellte fest, dass der Ausdruck weiter unten, um es zu true ausgewertet, wenn angesichts dieser: transitive([1], 1, {toString:_=>'1'});JavaScript transitiv Gleichheit

Ich verstehe nicht, warum.

Es macht Sinn, dass y und z gleich sind, aber wie können x und y gleich sein, wenn x und z nicht gleich sind?

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

Verwenden Sie den strikten Gleichheitsoperator '===', der sowohl den Typ als auch den Wert überprüft, nicht nur den Wert. –

+4

Ich machte ein [kleines Werkzeug] (https://nem035.github.io/js-equality-algorithms/), es könnte helfen. Das Tool zeigt Ihnen, wie die Engine '==' und '===' auswertet (einschließlich wie sie den Zwang ausführt), so dass Sie genau sehen können, was vor sich geht. – nem035

+1

@ nem035 tolles Werkzeug. wirklich hilfreich, um zu verstehen, was in einer Gleichheitsprüfung passiert. – jcjunction

Antwort

-1

In JavaScript gibt es ein Konzept der "Truthiness" und "falsyness". Werte wie 1 und '1' sind im Vergleich zu einem losen Vergleichsoperator wie == gleich, sind aber unter Verwendung eines strikten Gleichheitsoperators wie === nicht exakt gleich.

Das Objekt ist gleich 1, da JavaScript Typcode verwendet, um das Objekt in einen vergleichbaren Wert zu einem Primitiv zu konvertieren. Dies geschieht durch Aufruf der .toString() Methode des Objekts, die '1' zurückgibt und wie wir oben gelernt haben, truthy ist, wie 1, so dass sie als gleich gelten, wenn == verwendet wird.

Dies wird wahrscheinlich relevant sein: MDN: Equality comparisons and sameness.

Es ist am besten/üblich in JavaScript, immer === und !== anstelle von == und != zu verwenden.

+1

Beantwortet die Frage nicht. – Tushar

+0

Ich fügte eine direktere Antwort hinzu. Danke, dass Sie darauf hingewiesen haben, dass meine Antwort nicht ausreichend war. – TW80000

+0

@ TW80000 also, da x und z nicht primitiv sind, wenn sie Typzwang verwenden, sind sie nicht gleich? aber da y primitiv ist, ist dieser Vergleich? – jcjunction