ECMAScript relationella operatorer

Relateringsoperatorn utför jämförelseoperationer. Varje relationell operator returnerar ett Boolean-värde.

Normal jämförelsemetod

Relateringsoperatorn mindre än, större än, mindre än eller lika med och större än eller lika med utför jämförelseoperationer på två tal, jämförelsesättet är detsamma som matematisk jämförelseoperation.

Varje relationell operator returnerar ett Boolean-värde:

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

Men, att tillämpa relateringsoperatorn på två strängar, deras beteende är annorlunda. Många tror att mindre än betyder "förut i bokstavsordning", och större än betyder "efter i bokstavsordning", men det är inte så. För strängar jämförs varje tecken i den första strängen med teckencoden för motsvarande tecken i den andra strängen genom numerisk jämförelse. Efter att denna jämförelseoperation är klar returneras ett Boolean-värde. Problemet är att stora bokstävers teckenkoder är mindre än små bokstävers teckenkoder, vilket innebär att följande situationer kan uppstå:

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

I det föregående exemplet är strängen "Blue" mindre än "alpha", eftersom bokstaven B:s teckenkod är 66 och bokstaven a:s teckenkod är 97. För att tvångsvis få resultatet av att jämföra enligt den verkliga bokstavsordningen måste de två siffrorna konverteras till samma storlek (allt stora bokstäver eller alla små bokstäver) innan de jämförs:

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

Konvertera båda operanterna till små bokstäver för att säkerställa att "alpha" korrekt identifieras som före "Blue" i bokstavsordning.

Jämförelse av nummer och strängar

En annan besvärlig situation uppstår när två strängar som representerar nummer jämförs, till exempel:

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

Ovanstående kod jämför strängen "25" och "3". Båda operanterna är strängar, så jämförs deras teckenkoder (teckenkoden för "2" är 50, teckenkoden för "3" är 51).

Men vad händer om en av operanterna är ett nummer? Här är ett intressant exempel:

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

Här kommer strängen "25" att konverteras till numret 25 och jämföras med numret 3, vilket är som förväntat.

När som helst jämförs en nummer med en sträng, konverterar ECMAScript strängen till ett nummer och jämför dem i numerisk ordning.

Men vad om en sträng inte kan konverteras till ett nummer? Tänk på följande exempel:

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

Kan du förutse vad detta kodutdrag kommer att visa? Tecknet "a" kan inte konverteras till ett meningsfullt nummer. Men om man anropar parseInt() -metoden på det, returneras NaN. Enligt reglerna måste alla relationella operatorer som innehåller NaN returnera false, så detta kodutdrag returnerar också false:

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

Vanligtvis, om de två värdena som används i mindre än operationen returnerar false, måste större än eller lika med operationen returnera true, men om ett visst nummer är NaN, är situationen inte densamma.