ECMAScript Relational Operators

Relatiemateerders voeren vergelijkingen uit. Elke relatiemateerder retourneert een Boolean-waarde.

Algemene vergelijking

Relatiemateerders zoals kleiner, groter, kleiner dan of gelijk aan en groter dan uitvoeren vergelijkingen van twee getallen, op dezelfde manier als wiskundige vergelijkingen.

Elke relatiemateerder retourneert een Boolean-waarde:

var bResult1 = 2 > 1	// true
var bResult2 = 2 < 1	// false

Maar, het gedrag van relatiemateerders toepassen op twee strings is verschillend. Veel mensen denken dat kleiner betekent "voor de letterlijke volgorde", groter betekent "achter de letterlijke volgorde", maar dat is niet het geval. Voor strings wordt elke charactercode van de eerste string vergeleken met de charactercode van het equivalente character in de tweede string. Na het voltooien van deze vergelijking wordt een Boolean-waarde geretourneerd. Het probleem is dat de charactercodes van hoofdletters kleiner zijn dan die van kleine letters, wat betekent dat je de volgende situatie kunt tegenkomen:

var bResult = "Blue" < "alpha";
alert(bResult);	// true uitvoeren

In het bovenstaande voorbeeld is de string "Blue" kleiner dan "alpha", omdat het charactercode van het letter B 66 is en het charactercode van het letter a 97. Om een vergelijking op ware letterlijke volgorde te forceren, moeten de twee getallen worden omgezet naar dezelfde hoofdletter- of kleinelettervorm (alles hoofdletters of alles kleine letters) voordat ze worden vergeleken:

var bResult = "Blue".toLowerCase() < "alpha".toLowerCase();
alert(bResult);	//Uitvoer false

Door beide operanden naar kleine letters te converteren, wordt ervoor gezorgd dat correct wordt vastgesteld dat "alpha" in de lettervolgorde voor "Blue" staat.

Vergelijken van getallen en strings

Een ander moeilijk scenario doet zich voor bij het vergelijken van twee strings die nummers representeren, zoals:

var bResult = "25" < "3";
alert(bResult);	//Uitvoer "true"

Het stuk code hier vergelijkt de string "25" met "3". Beide operanden zijn strings, dus ze worden vergeleken op basis van hun charactercodes (de charactercode van "2" is 50, de charactercode van "3" is 51).

Maar wat als een van de operanden een getal is, dan wordt het interessant:

var bResult = "25" < 3;
alert(bResult);	//Uitvoer "false"

Hier wordt de string "25" geconverteerd naar het getal 25 en vergeleken met het getal 3, zoals verwacht.

Elke keer dat een getal en een string worden vergeleken, converteert ECMAScript de string naar een getal en vergelijkt deze dan numeriek.

Maar wat als een string niet kan worden geconverteerd naar een getal? Overweeg het volgende voorbeeld:

var bResult = "a" < 3;
alert(bResult);

Kan je voorspellen wat dit stuk code uitvoert? Het letter "a" kan niet worden geconverteerd naar een betekenisvol getal. Als je echter parseInt() op het oog hebt, retourneert het NaN. Volgens de regels moet elke relatiebewerking die NaN bevat false retourneren, dus deze code retourneert ook false:

var bResult = "a" >= 3;
alert(bResult);

Over het algemeen, als de twee waarden die worden vergeleken met de minder dan-operator false retourneren, moet de groter dan of gelijk-operator true retourneren, tenzij een van de getallen NaN is, dan is dit niet het geval.