2012-08-27 9 views
15

Ich erklärte einem Kollegen, dass Sie === und !== (und natürlich >== und <==) beim Vergleichen von Variablen in JavaScript verwenden sollten, so dass es die Argumente nicht zwingt und alle froopy und verwirrend, aber sie fragten mich ein zweiteiliger Frage, die ich nicht die Antwort auf wusste und dachte, dass ich die Experten hier fragen würde, und zwar ist es:Javascript Gleichheit Triple gleich, aber was ist größer als und weniger als?

Was > und < - wenn sie vergleichen sie sie auch die Argumente zwingen oder nicht - warum nicht ist dort eine Art von >> und << Operator (wahrscheinlich muss eine andere Syntax sein, wie ich denke, sie wäre Bit Shift-Operatoren, wenn es ich s geht den ganzen C-Stil entlang, aber Sie bekommen das Wesentliche)?

So kann ich einen Test schreiben die Antwort auf den ersten Teil zu finden, was ich auch tat, hier ist es:

// Demo the difference between == and === 
alert(5 == "5"); 
alert(5 === "5"); 

// Check out what happens with > 
alert(5 > "4");  
alert(5 > 4); 

und es zurückgegeben:

true 
false 

true 
true 

so tut es aussehen wie die > macht den Zwang seit > "4" und > 4 das gleiche Ergebnis zurückgeben. also wie wäre es mit dem zweiten Teil ...

Gibt es eine Art von Operator für > und <, die den Typ nicht zwingen (oder wie kann ich meinen Test ändern, um den Test sicher durchzuführen)?

+3

Es gibt eigentlich kein '> ==' oder '<==' in Javascript aus dem gleichen Grund die Antworten beschrieben. Siehe [Vergleichsoperatoren] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators) –

Antwort

13

Nein, es gibt keine Notwendigkeit für solche Betreiber. Die Typprüfung für diese relationalen Operatoren unterscheidet sich von der für Gleichheit und Ungleichheit. (bearbeiten — ist es vielleicht ein wenig stark zu sagen, dass es „keine Notwendigkeit“, das stimmt nur, weil JavaScript es hält so :-)

Insbesondere die > und < und >= und <= Operatoren arbeiten alle entweder auf zwei numerische Werte oder zwei Zeichenfolgen, die numerische Werte bevorzugen. Das heißt, wenn ein Wert eine Zahl ist, wird die andere als Zahl behandelt. Wenn eine Nicht-Nummer nicht sauber in eine Zahl konvertiert werden kann (dh wenn sie als NaN endet), ist das Ergebnis des Vergleichs undefined. (Das ist ein wenig problematisch, weil undefined wie false im Rahmen einer if Aussage aussehen wird.)

Wenn beide Werte Strings sind, dann wird eine Datenabgleichs Ordnung String-Vergleich statt durchgeführt wird.

Wenn Sie darüber nachdenken, machen diese Vergleiche keinen Sinn für Objektinstanzen; Was bedeutet es für ein Objekt, größer zu sein als ein anderes? Ich nehme an, dass dies bedeutet, dass, wenn Sie sich mit Werten von Variantentypen konfrontiert sehen, die so verglichen werden, und das Probleme verursacht, dann müssen Sie die Situation selbst erkennen. Es scheint mir, dass es gut wäre, flussaufwärts zu arbeiten und darüber nachzudenken, ob der Code, der zu einer solchen Situation führt, etwas Falsches an sich hat.

+0

Agh, emoticlosing-parenthesicon ..! >. <(Aber +1 sowieso.) –

+0

@DavidThomas Entschuldigung, aber das ist Teil meiner "jolly SO Teilnehmer" persona – Pointy

+0

'true> = 1 'ist wahr :(aber ich stimme zu, es ist weniger beunruhigend als die == Operator. – Alex

8

Gibt es irgendeine Art von Operator> und <, die nicht dem Typ

Nr do coerce

wie kann ich meine Test ändern Sie den Test sicher

Sie haben explizit die Typen testen würde ausführen zu:

typeof a === typeof b && a > b 
1

I verwiesen Flanagans JavaScript: The Definitive Guide (5. Ed .) und es scheint keine Vergleichsoperatoren ohne Zwang zu geben.

Sie haben recht mit den < < und >> sind in der Tat bitweise Operatoren, so dass würde nicht funktionieren.

Ich würde vorschlagen, dass Sie bewusst die Werte youself coerce:

var num_as_string = '4'; 
var num = +num_as_string; 
if (5 > num) { ... } 
+0

Was bedeutet die '+ ' Syntax in' var num = + num_as_string; '? –

+1

@YatharthROCK: Es ist der unäre Plusoperator und konvertiert einen Wert in eine Zahl: https://developer.mozilla.org/en-US/docs /JavaScript/Reference/Operators/Arithmetic_Operators#-_.28Unary_Negation.29 –

0
12 > '100' // false 
'12' > 100 // false 
'12' > '100' // true 

Wie andere schon erwähnt, wenn man eine Zahl ist, die andere zu einer Reihe gegossen wird. Diese Vorschrift gilt auch für diese Fälle auch:

null > 0 // false 
null < 0 // false 
null >= 0 // true 

Allerdings könnte es Fälle geben, die Sie null >= 0 brauchen würden false (oder eine der Zahlenfolge Vergleichsfälle oben) zu geben, daher ist es in der Tat ein Bedarf einen strengen Vergleich haben >== oder <==.

Zum Beispiel: Ich habe ein compareFunction für die Array.prototype.sort() Schreiben und ein Ausdruck wie x>=0null Werte wie 0-en und sie zusammen behandeln würde, während ich sie an anderer Stelle setzen will. Ich muss extra Logik für diese Fälle schreiben.

Javascript sagt, handle mit ihm selbst (in der Praxis).

Verwandte Themen