ECMAScript Identiske Operatorer

At afgøre, om to variabler er ens, er en meget vigtig operation i programdesign. Når det gælder primitive værdier, er denne operation meget simpel, men når det kommer til objekter, bliver opgaven lidt mere kompleks.

ECMAScript tilbyder to sæt af lighedsom operators: lighedstegn og ulighedstegn bruges til at håndtere primitive værdier, og fuldlighedstegn og fuldulighedstegn bruges til at håndtere objekter.

Lighedstegn og ulighedstegn

I ECMAScript betyder lighedstegnet (==) dobbeltlighedstegnet, og det returnerer kun true, når de to operands er ens. Ulighedstegnet (!=) betyder udligningstegnet plus lighedstegnet, og det returnerer kun true, når de to operands er forskellige. For at afgøre om de to operands er ens, udfører begge disse operatorer typekonvertering.

Reglerne for at udføre typekonvertering er som følger:

  • Hvis en operand er en Boolean-værdi, skal den konverteres til et talsværdi, før lighedskontrol udføres. false konverteres til 0, og true til 1.
  • Hvis en operand er en streng, og den anden er et tal, skal strengen prøves konverteret til et tal, før lighedskontrol udføres.
  • Hvis en operand er et objekt, og den anden er en streng, skal objektet prøves konverteret til en streng, før lighedskontrol udføres.
  • Hvis en operand er et objekt, og den anden er et tal, skal objektet prøves konverteret til et tal, før lighedskontrol udføres.

Ved sammenligning følger denne operator også følgende regler:

  • Værdierne null og undefined er ens.
  • Ved at kontrollere lighed kan null og undefined ikke konverteres til andre værdier.
  • Hvis en operand er NaN, returnerer lighedstegnet false, og ulighedstegnet returnerer true.
  • Hvis begge operands er objekter, sammenlignes deres referencer. Hvis begge operands peger på det samme objekt, returnerer lighedstegnet true, ellers er de to operands forskellige.

Vigtig bemærkning:Selvom begge tal er NaN, returnerer lighedstegnet false, fordi ifølge reglerne er NaN ikke lig med NaN.

Følgende tabel viser nogle specielle tilfælde samt deres resultater:

udtryk værdi
null == undefined true
"NaN" == NaN false
5 == NaN false
NaN == NaN false
NaN != NaN true
false == 0 true
true == 1 true
true == 2 false
undefined == 0 false
null == 0 false
"5" == 5 true

Fuldt lig og ikke-fuldt lig operatorer

Lige og ikke-lige operatorer har lignende operationer som fuldt lig og ikke-fuldt lig operatorer. Disse operatorer gør det samme som lige og ikke-lige operatorer, men de udfører ikke typekonvertering, før de tjekker lighed.

Fuldt lig operator repræsenteres af tre lig tegn (===), og de returnerer kun true, når operandene er ens uden typekonvertering.

For eksempel:

var sNum = "66";
var iNum = 66;
alert(sNum == iNum);	//Udskriver "true"
alert(sNum === iNum);	//Udskriver "false"

I denne kode bruger den første alert lig operatorer til at sammenligne strengen "66" med tallet 66, og udskriver "true". Som nævnt tidligere skyldes dette, at strengen "66" vil blive konverteret til tallet 66, før den sammenlignes med den anden tal 66. Den anden alert bruger fuld lig operator uden typekonvertering, selvfølgelig er strengen ikke lig med tallet, så udskriver "false".

Ikke-lige operatorer repræsenteres af et udsagns tegn plus to lig tegn (!==), og de returnerer kun true, når operandene ikke skal konverteres til en anden type for at være ulige.

For eksempel:

var sNum = "66";
var iNum = 66;
alert(sNum != iNum);	//Udskriver "false"
alert(sNum !== iNum);	//Udskriver "true"

Her, den første alert bruger ikke-lige operatorer til at konvertere strengen "66" til tallet 66, så den er lig med den anden operand 66. Derfor er beregningsresultatet "false", fordi de to operand er ens. Den anden alert bruger ikke-lige operatorer. Spørgsmålet er: "Er sNum forskellig fra iNum?" Svaret er ja (true), fordi sNum er en streng, og iNum er et tal, de er selvfølgelig forskellige.