Hva er den riktige måten å kontrollere for likhet mellom strenger i JavaScript?
always Inntil du fullt ut forstår forskjellene og implikasjonene av å bruke ==
og ===
-operatorene, bruk ===
-operatoren siden det vil spare deg for obskure (ikke-åpenbare) feil og WTF-er. Den "vanlige" ==
operatøren kan ha svært uventede resultater på grunn av typetvang internt, så bruk av ===
er alltid den anbefalte tilnærmingen.
For innsikt i dette, og andre "gode vs. dårlige" deler av Javascript, kan du lese om Douglas Crockford og hans arbeid. Det er en flott Google Tech Talk der han oppsummerer mye god informasjon: [
Oppdatering:
Serien You Don't Know JS av Kyle Simpson er utmerket (og gratis å lese på nettet). Serien går inn i de ofte misforståtte områdene av språket og forklarer de "dårlige delene" som Crockford foreslår at du unngår. Ved å forstå dem kan du bruke dem riktig og unngå fallgruvene.
Boken Up & Going inneholder et avsnitt om Equality, med denne spesifikke oppsummeringen av når du skal bruke de løse (==
) kontra strenge (===
) operatorene:
For å koke ned en hel masse detaljer til noen få enkle takeaways, og hjelpe deg med å vite om du skal bruke
==
eller===
i forskjellige situasjoner, her er mine enkle regler:
- Hvis en av verdiene (aka siden) i en sammenligning kan være den
sanne
ellerfalske
verdien, unngå==
og bruk===
.- Hvis en av verdiene i en sammenligning kan være av disse spesifikke verdiene (
0
,""
, eller[]
-- tom matrise), unngå==
og bruk===
.- I alle andre tilfeller er det trygt å bruke
==
. Ikke bare er det trygt, men i mange tilfeller forenkler det koden din på en måte som forbedrer lesbarheten.
Jeg anbefaler fortsatt Crockford's snakk for utviklere som ikke ønsker å investere tid til å virkelig forstå Javascript —det's gode råd for en utvikler som bare av og til jobber i Javascript.
Hvis du vet at de er strenger, er det ikke nødvendig å sjekke typen.
"a" == "b"
Vær imidlertid oppmerksom på at strengobjekter ikke vil være like.
new String("a") == new String("a")
vil returnere false.
Kall metoden valueOf() for å konvertere den til en primitiv for String-objekter,
new String("a").valueOf() == new String("a").valueOf()
vil returnere true
Det er faktisk to måter å lage strenger på i javascript.
var str = 'Javascript';
Dette skaper en primitiv strengverdi.
var obj = new String('Javascript');
Dette oppretter et innpakningsobjekt
av typen String
.
typeof str // string
.
typeof obj // objekt
Så den beste måten å kontrollere for likhet er å bruke ===
-operatoren fordi den kontrollerer både verdi og type for begge operandene.
Hvis du vil kontrollere om to objekter er like, er det riktig å bruke String.prototype.valueOf
.
new String('javascript').valueOf() == new String('javascript').valueOf()