Warum gibt 1==1==1 wahr zurück, “1”==”1″==”1″ gibt wahr zurück und “a”==”a”==”a” gibt falsch zurück? [duplicate]

Lesezeit: 6 Minuten

Benutzer-Avatar
Chris97ong

function a() { return (1 == 1 == 1); }
function b() { return ("1" == "1" == "1"); }
function c() { return ("a" == "a" == "a"); }

Ich habe den obigen Code in der Chrome-Konsole getestet und aus irgendeinem Grund a() gibt wahr zurück, b() gibt true zurück, und c() gibt falsch zurück.

Warum ist das so?

  • Hinweis: X == Y == Z wird ausgewertet als ((X == Y) == Z).

    – Schwarzes Loch

    9. Mai 2014 um 9:51 Uhr

  • Seltsam, true == "1" wertet zu true.

    – Codor

    9. Mai 2014 um 9:53 Uhr


  • Verwandte: Warum gibt (0 < 5 < 3) wahr zurück?

    – Felix Klinge

    9. Mai 2014 um 9:57 Uhr

  • mögliches Duplikat von Spielt es eine Rolle, welchen Gleichheitsoperator (== vs ===) ich in JavaScript-Vergleichen verwende? und Unterschied zwischen == und === in JavaScript.

    Benutzer456814

    9. Mai 2014 um 12:17 Uhr


  • @Cupcake: In gutem Glauben denke ich, dass der Hauptkopfkratzer hier ist, dass eine Gleichheit, die mathematisch wahr zu sein scheint, für JS tatsächlich falsch ist, nicht dass zB true == 1 ist wahr. Mit anderen Worten, der Aha-Moment ist nicht zu erkennen, dass die Typen eine Rolle spielen, sondern dass alle etwas miteinander vergleichen true. Ich bin mir sicher, dass es irgendwo einen Duplikat davon gibt, aber meiner Meinung nach ist es keiner von denen, die Sie anbieten.

    – Jon

    9. Mai 2014 um 12:45 Uhr


Benutzer-Avatar
Jon

Weil Sie das (boolesche) Ergebnis der ersten Gleichheit mit dem (nicht-booleschen) dritten Wert vergleichen.

In Code, 1 == 1 == 1 ist äquivalent zu (1 == 1) == 1 ist äquivalent zu true == 1.

Dies bedeutet, dass die drei Methoden einfacher geschrieben werden können als:

function a() { return (true == 1); }
function b() { return (true == "1"); }
function c() { return (true == "a"); }

Diese Vergleiche funktionieren gem diese Regeln (Hervorhebung von mir):

Wenn die beiden Operanden nicht vom gleichen Typ sind, konvertiert JavaScript die Operanden und wendet dann einen strengen Vergleich an. Wenn einer der Operanden eine Zahl oder ein boolescher Wert ist, werden die Operanden nach Möglichkeit in Zahlen konvertiert; andernfalls, wenn einer der Operanden eine Zeichenfolge ist, wird der Zeichenfolgenoperand nach Möglichkeit in eine Zahl konvertiert. Wenn beide Operanden Objekte sind, vergleicht JavaScript interne Referenzen, die gleich sind, wenn Operanden auf dasselbe Objekt im Speicher verweisen.

Was passiert also in c ist das "a" wird in eine Zahl umgewandelt (gibt NaN) und das Ergebnis ist streng verglichen zu true in eine Zahl umgewandelt (gibt 1).

Seit 1 === NaN ist falsegibt die dritte Funktion zurück false. Es ist sehr leicht zu erkennen, warum die ersten beiden Funktionen zurückkehren true.

  • Es ist auch erwähnenswert, dass die Verwendung von striktem Gleichheitszeichen (===)-Operator verhindert dieses unerwartete Verhalten für "1"

    – Konrad Gadzina

    9. Mai 2014 um 10:16 Uhr

  • @KonradGadzina: Strenge Gleichheit bringt alle drei Funktionen zurück false.

    – Jon

    9. Mai 2014 um 10:18 Uhr

  • Sie haben Recht. Ich habe so viele gesehen true hier, dass ich das vergessen habe. ^^

    – Konrad Gadzina

    9. Mai 2014 um 10:20 Uhr


  • @ Jon: So what happens in c is that "a" is converted to a number (giving NaN) keiner der Operanden ist eine Zahl. Ich denke, die Konvertierung endet mit "true" == "a" statt 1 == NaN.

    – Flacher

    9. Mai 2014 um 12:57 Uhr

  • @Flater: Nein. Die Passage, die ich oben zitiert habe, ist sehr klar darüber, was genau passiert (“wenn einer der Operanden eine Zahl ist oder ein boolescher Wert” — der linke Operand ist boolesch). Es ist auch sehr leicht zu sehen, dass Ihre Behauptung falsch ist: 1 == 1 == "true" => false.

    – Jon

    9. Mai 2014 um 13:02 Uhr


Benutzer-Avatar
Von Löwe

Da 1 == true

Aber "a" != true

Also im Grunde passiert das

1 == 1, "1" == "1" und "a" == "a" werden alle als bewertet true und dann mit dem nächsten Wert verglichen.

Die Saite "1" wird in eine Zahl umgewandelt (1) vor dem Vergleich mit true und gilt damit auch als gleich true.

Nun, das “WARUM?!?!” Frage erklärt sich aus der Tatsache, dass Javascript seine Wurzeln in der C-Sprachfamilie hat. Dabei gilt jede andere Zahl als 0 als gültig true boolesch. :-/

  • JavaScript tut es auf jeden Fall nicht haben seine Wurzeln in der C-Sprachfamilie. Es hat seine Wurzeln in LISP-Dialekten wie Scheme und wurde auch von Self inspiriert. Es verwendet nur die Syntax von C, aber nicht seine Semantik. IMHO ist dies eines der am weitesten verbreiteten und ziemlich falschen Missverständnisse von JavaScript. Um dies zu unterstreichen, werfen Sie bitte auch einen Blick auf den Artikel von Douglas Crockford JavaScript: Die am meisten missverstandene Programmiersprache der Welt.

    – Golo Roden

    9. Mai 2014 um 19:04 Uhr

  • @GoloRoden: Sei nicht albern. Wenn JavaScript nicht die Semantik von C hätte, wären eine Reihe klassischer semantischer Fehler in C, wie z if (x = 5) würde in JS nicht existieren … aber sie tun es, genau wie in C. IT hat es sicherlich nicht alle Die Semantik von C, aber es verhält sich viel mehr wie C als wie irgendein Lisp.

    – Maurer Wheeler

    9. Mai 2014 um 22:25 Uhr


  • @MasonWheeler-Zuweisungen in Bedingungen sind KEIN Fehler oder Defekt.

    – Meilen Route

    10. Mai 2014 um 3:32 Uhr

  • @MilesRoul: Versuchen Sie, das zu sagen … na ja … alle, die jemals davon gebissen wurden.

    – Maurer Wheeler

    10. Mai 2014 um 5:06 Uhr

  • @funkybro Ein Profi zu sein bedeutet nicht, dass Unfälle nicht passieren können. Ich programmiere C seit über 10 Jahren und in letzter Zeit habe ich das vergessen break; in einem C switch Aussage…

    – glglgl

    10. Mai 2014 um 9:41 Uhr

Weil 1 und “1” beide als Zahlen in wahr umgewandelt werden. Dies ist bei “a” nicht der Fall. Deswegen:

("1" == "1" == "1") 

wertet zu

(("1" == "1") == "1") 

was sich auswertet

(true == "1")

Ähnlich,

("1" == 1 == "1") 

auch wahr ist, oder irgendeine Kombination davon. Tatsächlich ist jede Zahl ungleich Null wahr, wenn sie in einen booleschen Wert umgewandelt wird.

Wohingegen “a” nicht als wahr ausgewertet wird.

Das liegt daran, dass JavaScript eine schwach typisierte Sprache ist. Das bedeutet, dass es nicht ausdrucksstark genug ist, über Typen zu sprechen, und Werte implizit dazu zwingt, in Typen zu gehören, zu denen sie keinen semantischen Bezug haben. (1 == 1) == 1 wird also als wahr ausgewertet, da (1 == 1) korrekt als wahr ausgewertet wird, sodass JavaScript (wahr) = 1 auswertet. Insbesondere wird 1 in einen booleschen Wert (oder wahr zu) umgewandelt eine Zahl – ich vergesse welche, aber das Ergebnis ist praktisch das gleiche).

Der Punkt ist, dass JavaScript ist drehen eine Art von Wert in eine andere Art von Wert hinter Ihrem Rücken.

Ihre Frage zeigt, warum dies ein Problem ist: (‘a’ == ‘a’) == ‘a’ ist falsch, weil (‘a’ == ‘a’) wahr ist und JavaScript am Ende (true) = vergleicht = ‘ein’. Da gibt es eben nein eine sinnvolle Möglichkeit, einen booleschen Wert in einen Buchstaben (oder einen Buchstaben in einen booleschen Wert) umzuwandeln, ist diese Aussage falsch. Das bricht natürlich die referenzielle Transparenz für (==).

Benutzer-Avatar
sdfc

Es ist wahr, dass (1 == 1) == 1. Dann wird es sein true == 1aber nicht drin a == a == a.

Benutzer-Avatar
Wuiyang

Boolean wird als Bit behandelt, jedes Bit steht für wahr oder falsch (1 für wahr, 0 für falsch)

1 steht also für wahr und 0 für falsch

und 1 == 1 == 1 wird wie (1 == 1) == 1, wahr == 1, wahr sein

während ‘a’ == ‘a’ == ‘a’ sein wird (‘a’ == ‘a’) == ‘a’, wahr == ‘a’, falsch

BONUS: 0 == 1 == 0, 1 == 0 == 0 und 0 == 0 == 1 gibt wahr zurück

1228070cookie-checkWarum gibt 1==1==1 wahr zurück, “1”==”1″==”1″ gibt wahr zurück und “a”==”a”==”a” gibt falsch zurück? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy