11 Stimmen

In Javascript wird <int-value> == "<int-value>" als wahr ausgewertet. Warum ist das so?

Wenn ich 0 == "0" mache, wird es als wahr ausgewertet. Versuchen Sie es,

if( -777 == "-777" ) alert("same");

passiert ein Alarm.

Außerdem fällt auf, dass true == "true" nicht zu true ausgewertet wird. Versuchen Sie es,

if( false == "false" ) alert("same");

Alarm findet nicht statt.

Warum ist das so?

33voto

Andrey Fedorov Punkte 8356

Das Verhalten von == ist ein wenig langatmig, aber klar definiert in der ecma-262-Spezifikation :

11.9.3 Der abstrakte Gleichheitsvergleichsalgorithmus

Der Vergleich x == y, wobei x und y Werte sind, ergibt wahr oder falsch. Ein solcher Vergleich wird wie folgt durchgeführt wie folgt durchgeführt:

  1. Wenn Typ(x) sich von Typ(y) unterscheidet, gehen Sie zu Schritt 14.
  2. Wenn Type(x) Undefined ist, wird true zurückgegeben.
  3. Wenn Type(x) Null ist, wird true zurückgegeben.
  4. Wenn Typ(x) nicht Zahl ist, fahren Sie mit Schritt 11 fort.
  5. Wenn x NaN ist, wird false zurückgegeben.
  6. Wenn y gleich NaN ist, wird false zurückgegeben.
  7. Wenn x der gleiche Zahlenwert wie y ist, wird true zurückgegeben.
  8. Wenn x gleich +0 und y gleich 0 ist, wird true zurückgegeben.
  9. Wenn x gleich 0 und y gleich +0 ist, wird true zurückgegeben.
  10. Return false.
  11. Wenn Type(x) String ist, dann wird true zurückgegeben, wenn x und y genau die gleiche Folge von Zeichen sind (gleiche Länge und gleiche Zeichen an entsprechenden Positionen). Andernfalls wird false zurückgegeben.
  12. Wenn Type(x) Boolean ist, wird true zurückgegeben, wenn x und y beide true sind oder beide falsch sind. Andernfalls wird false zurückgegeben.
  13. Gibt true zurück, wenn x und y sich auf dasselbe Objekt beziehen oder wenn sie sich auf Objekte verweisen, die miteinander verbunden sind (siehe 13.1.2). Andernfalls wird false zurückgegeben.
  14. Wenn x null und y undefiniert ist, wird true zurückgegeben.
  15. Wenn x undefiniert ist und y null ist, wird true zurückgegeben.
  16. Wenn Typ(x) eine Zahl und Typ(y) ein String ist, wird das Ergebnis der Vergleichs x == ToNumber(y) zurück.
  17. Wenn Typ(x) gleich String und Typ(y) gleich Zahl ist, wird das Ergebnis der Vergleichs ToNumber(x) == y.
  18. Wenn Type(x) Boolean ist, wird das Ergebnis des Vergleichs ToNumber(x) == y zurückgegeben.
  19. Wenn Type(y) Boolean ist, wird das Ergebnis des Vergleichs x == ToNumber(y).
  20. Wenn Type(x) entweder String oder Number und Type(y) Object ist, wird zurückgegeben das Ergebnis des Vergleichs x == ToPrimitive(y).
  21. Wenn Type(x) Object und Type(y) entweder String oder Number ist, wird die Ergebnis des Vergleichs zurück ToPrimitive(x) == y.
  22. Return false.

Schritt 16 gilt für Ihr früheres Beispiel:

   0 == "0"            // apply 16
  0 == toNumber("0")
  0 == 0              // apply 7
  true

Für letztere gilt Schritt 18, für letztere Schritt 16:

   true == "true"            // apply 18
  toNumber(true) == "true"
  1 == "true"               // apply 16
  1 == toNumber("true")
  1 == NaN                  // apply 6
  false

11voto

Paolo Bergantino Punkte 465120

Dies zu tun:

if(5 == "5")

Javascript wandelt die ersten 5 in eine Zeichenkette um. Versuchen Sie dies:

if(5 === "5")

Le site === macht Javascript bewerten Typ als gut.

Dies ist eigentlich ein Duplikat von diesem question wo dies sehr gut erklärt wird.

7voto

nickf Punkte 517253

Weil Javascript lose typisiert ist, wird es Ihre Variablen abhängig von der Operation und dem Typ der anderen Variablen in der Operation stillschweigend anpassen.

alert ("5" - 1);  // 4  (int)
alert ("5" + 1);  // "51" (string) "+" is a string operator, too
alert ("5" == 5); // true

Was Sie sich ansehen sollten, ist Identität Prüfung ( === ). Dadurch wird sichergestellt, dass die Variablen identisch , nicht nur gleich .

alert("5" == 5);  // true, these are equal
alert("5" === 5); // false, these are not identical.

Siehe auch diese Frage: Wie unterscheiden sich die Vergleichsoperatoren Gleichheit und Identität? Die Implementierung von PHP ist der von Javascript sehr ähnlich.

4voto

Christian C. Salvadó Punkte 763569

JavaScript hat zwei Sätze von Gleichheitsoperatoren:

  • === and !== (strenge Gleichheitsoperatoren)
  • == and != (Standard-Gleichheitsoperatoren)

Die Standard-Gleichheitsoperatoren führen den richtigen Vergleich durch, wenn beide Operanden vom gleichen Typ sind, aber Sie können einige unerwartete Ergebnisse erhalten, wenn sie nicht vom gleichen Typ sind:

'' == '0' // false
0 == '' // true
0 == '0' // true
false == 'false' // false
false == '0' // true
false == undefined // false
false == null // false
null == undefined // true
' \t\r\n ' == 0 // true

Hierfür empfehle ich immer die Verwendung der strengen Gleichheitsoperatoren (===, !==).

1voto

Chris Ballance Punkte 32892

Javascript wandelt "false" nicht in den booleschen Wert false um, sondern nur in die Zeichenkette "false".

Sie können lose Cast-String-Werte auf ihre Integer-Äquivalent, so dass Ihr erstes Beispiel funktioniert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X