ECMAScript relatiionsoperatorer

Relateringsoperatorer udfører sammenligningsoperationer. Hver relateringsoperator returnerer en Boolean-værdi.

Almindelig sammenligningsmetode

Relateringsoperatorer som mindre end, større end, mindre end eller lig med og større end eller lig med udfører sammenligningsoperationer mellem to tal, på samme måde som aritmetiske sammenligningsoperationer.

Hver relateringsoperator returnerer en Boolean-værdi:

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

Men, når man anvender relateringsoperatorer på to strenge, adfærdene er forskellige. Mange mennesker mener, at mindre betyder "før i alfabetisk rækkefølge", og større betyder "efter i alfabetisk rækkefølge", men det er ikke tilfældet. For strenge sammenlignes hver karakter i den første streng med karakterkoden for den tilsvarende position i den anden streng. Efter denne sammenligning returneres en Boolean-værdi. Problemets essens er, at store bogstaver har lavere karakterkoder end små bogstaver, hvilket betyder, at der kan opstå følgende situationer:

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

I de ovenstående eksempel er strengen "Blue" mindre end "alpha", fordi tegnet B's karakterkode er 66, og tegnet a's karakterkode er 97. For at opnå en sammenligning i den rigtige alfabetiske rækkefølge, skal de to tal konverteres til samme skriftstørrelse (hele store eller hele små), før sammenligningen udføres:

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

Konverter begge operands til små bogstaver for at sikre, at "alpha" korrekt identificeres som værende før "Blue" i alfabetisk rækkefølge.

Sammenligning af tal og strenge

En anden svær situation opstår, når man sammenligner to tal, der er angivet som strenge, f.eks.:

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

Denne kode sammenligner strengen "25" og "3". Begge operands er strenge, så sammenligningen sker baseret på deres tegn ("2" har tegncoden 50, og "3" har tegncoden 51).

Men hvis en af de anvendte tal konverteres til et tal, bliver resultatet mere interessant:

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

Her vil strengen "25" blive konverteret til tallet 25 og derefter sammenlignes med tallet 3, som forventet.

Når man sammenligner et tal med en streng, konverterer ECMAScript altid strengen til et tal og sammenligner derefter efter numerisk rækkefølge.

Men hvad hvis en streng ikke kan konverteres til et tal? Overvej nedenstående eksempel:

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

Kan du forudse, hvad denne kode vil outputte? Bogstavet "a" kan ikke konverteres til et meningsfuldt tal. Men hvis man kalder parseInt() metoden på det, returneres NaN. Ifølge reglerne skal enhver relationel operator, der indeholder NaN, returnere false, så denne kode outputter også false:

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

Normalt vil de to værdier, der sammenlignes med mindre-til-operatoren, returnere false, men hvis en af værdierne er NaN, er situationen ikke den samme.