Hvilken likhetstegnoperator (== vs ===) skal brukes i JavaScript-sammenligninger?
Jeg bruker JSLint for å gå gjennom JavaScript, og det returnerer mange forslag om å erstatte ==
(to likhetstegn) med ===
(tre likhetstegn) når du gjør ting som å sammenligne idSele_UNVEHtype.value.length == 0
inne i en if
-setning.
Er det en ytelsesfordel å erstatte ==
med ===
?
Enhver ytelsesforbedring vil være velkommen ettersom det finnes mange sammenligningsoperatorer.
Hvis ingen typekonvertering finner sted, vil det være en ytelsesgevinst i forhold til ==
?
5666
3
Identitetsoperatoren (
===
) oppfører seg identisk med likhetoperatoren (==
) bortsett fra at det ikke gjøres noen typekonvertering, og typene må være like for å anses som like.Referanse: Javascript-veiledning: Sammenligningsoperatorer
Operatoren
==
vil sammenligne for likhet etter å ha gjort eventuelle nødvendige typekonverteringer. Operatoren===
vil ikke gjøre konverteringen, så hvis to verdier ikke er av samme type, vil===
bare returnerefalse
. Begge er like raske.For å sitere Douglas Crockfords utmerkede JavaScript: The Good Parts,
Oppdatering:
Et godt poeng ble tatt opp av @Casebash i kommentarene og i @Phillipe Laybaert's svar angående referansetyper. For referansetypene
==
og===
fungerer konsekvent med hverandre (bortsett fra i et spesielt tilfelle).Spesialtilfellet er når du sammenligner en bokstav med et objekt som evaluerer til samme bokstav, på grunn av dens
toString
ellervalueOf
metode. Tenk for eksempel på sammenligningen av en strengliteral med et strengobjekt opprettet avString
-konstruktøren.Her sjekker
==
-operatoren verdiene til de to objektene og returnerertrue
, men===
ser at de ikke er av samme type og returnererfalse
. Hvilken er riktig? Det kommer virkelig an på hva du prøver å sammenligne. Mitt råd er å omgå spørsmålet helt og bare ikke brukeString
-konstruktøren for å lage strengobjekter.Reference http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3
Bruk av
==
-operatoren (Likhet)Bruke
===
-operatoren (Identitet)Dette er fordi likhetsoperatoren
==
skriver tvang, noe som betyr at tolkeren implisitt prøver å konvertere verdiene før sammenligning.På den annen side gjør identitetsoperatoren
===
ikke typetvang, og konverterer dermed ikke verdiene ved sammenligning, og er derfor raskere (i henhold til This JS benchmark-testen) ettersom den hopper over ett trinn.Det er usannsynlig at det vil være noen ytelsesforskjell mellom de to operasjonene i din bruk. Det er ingen typekonvertering som skal gjøres fordi begge parametrene allerede er av samme type. Begge operasjonene vil ha en typesammenligning etterfulgt av en verdisammenligning.