Jaki jest prawidłowy sposób sprawdzenia równości między ciągami w JavaScript?
javascript
string
JSS
źródło
źródło
{} == "[object Object]"
na przykład ma wartość true.String().equals()
nie jest to metoda w JS ...Odpowiedzi:
zawszeDopóki nie w pełni zrozumiesz różnice i implikacje korzystania zoperatorów==
i===
, użyj===
operatora, ponieważ uratuje cię to od niejasnych (nieoczywistych) błędów i WTF. „Zwykły”==
operator może mieć bardzo nieoczekiwane wyniki ze względu na wewnętrzny przymus typu, więc użycie===
jest zawsze zalecanym podejściem.Aby uzyskać wgląd w to i inne „dobre kontra złe” części Javascript, poczytałem o Douglasie Crockfordie i jego pracy. Jest świetna Google Tech Talk, w której podsumowuje wiele dobrych informacji: http://www.youtube.com/watch?v=hQVTIJBZook
Aktualizacja:
Seria You Don't Know JS autorstwa Kyle'a Simpsona jest doskonała (i do przeczytania online za darmo). Seria omawia często źle rozumiane obszary języka i wyjaśnia „złe strony”, których sugeruje Crockford. Rozumiejąc je, możesz właściwie z nich korzystać i unikać pułapek.
Książka „ Up & Going ” zawiera sekcję dotyczącą równości , z tym konkretnym podsumowaniem, kiedy należy używać operatorów loose (
==
) vs strict (===
):Nadal polecam przemówienie Crockforda programistom, którzy nie chcą poświęcać czasu na prawdziwe zrozumienie Javascript - to dobra rada dla programistów, którzy tylko czasami pracują w Javascript.
źródło
if (typeof foo == "string")
===
operatora i nigdy nie martwić się o to, czy „naprawdę jestem w 100% pewien, że==
zachowam się tak, jak myślę?”++
/--
).++
ani oświadczeń--
jednowierszowych, ani operatora, ani żadnej innej całkowicie uzasadnionej praktyki kodowania, którą Crockford uznał za „szkodliwą”. I oczywiście nigdy nawet nie zastanawia się nad użyciem, a nawet jeśli ich pułapki są dobrze zrozumiane. I widziałeś kolejną wersję JS? Bardziej rygorystyczna składnia i kilka funkcji pomocniczych, z których niektóre latają od lat, to wszystko, co otrzymujemy po całym tym czasie. Składnia wcale się nie zmieniła. Jeśli za tym stoi Crockford, to było źle.if/else
continue
new
eval
with
Jeśli wiesz, że są łańcuchami, nie ma potrzeby sprawdzania typu.
Należy jednak pamiętać, że obiekty łańcuchowe nie będą równe.
zwróci fałsz.
Wywołaj metodę valueOf (), aby przekształcić ją w operację podstawową dla obiektów String,
zwróci prawdę
źródło
new String("a") == "a"
jest prawdą (ale nie byłoby===
), ponieważ lewa strona zostanie przekonwertowana na pierwotną wartość ciągu.new String("a") == new String("a")
,new String("a") === new String("b")
,new String("a") === new String("a")
będzie cały zwrotfalse
, ponieważ masz do czynienia z odniesieniami do obiektów wString
klasie, a nie prymitywów typustring
.new String(foo)
tworzy obiekt łańcuchowy iString(foo)
konwertuje foo na łańcuch podstawowy.Tylko jeden dodatek do odpowiedzi: Jeśli wszystkie te metody zwracają wartość false, nawet jeśli łańcuchy wydają się być równe, możliwe jest, że po lewej i / lub prawej stronie jednego łańcucha występuje spacja. Więc po prostu umieść
.trim()
na końcu łańcucha przed porównaniem:Straciłem godziny, próbując dowiedzieć się, co jest nie tak. Mam nadzieję, że to komuś pomoże!
źródło
fetch
). Wielkie dzięki.to, co doprowadziło mnie do tego pytania, to
padding
iwhite-spaces
sprawdź moją sprawę
i tytuł był
" LastName"
źródło
.toString().trim()
wO ile naprawdę nie wiesz, jak działa przymus, powinieneś unikać
==
operatora tożsamości i używać go===
. Ale powinieneś przeczytać to, aby zrozumieć, jak to działa .Jeśli używasz
==
, pozwalasz językowi na wykonanie pewnego przymusu, więc na przykład:Jak powiedział Douglas Crockford w swojej książce:
źródło
{}==" "
dał miUnexpected token ==
właściwy sposób, aby to zrobić?Istnieją dwa sposoby tworzenia łańcuchów w javascript.
var str = 'Javascript';
To tworzy prymitywną wartość ciągu.var obj = new String('Javascript');
Spowoduje to utworzenie typu opakowaniaString
.typeof str // string
typeof obj // object
Zatem najlepszym sposobem sprawdzenia równości jest użycie
===
operatora, ponieważ sprawdza on wartość, a także rodzaj obu operandów.Jeśli chcesz sprawdzić równość między dwoma obiektami, użyj
String.prototype.valueOf
poprawnego sposobu.źródło
Ciąg
Objects
można sprawdzić za pomocąJSON.stringyfy()
sztuczki.źródło
Biorąc pod uwagę, że oba ciągi mogą być bardzo duże, istnieją 2 główne podejścia
bitwise search
ilocaleCompare
Poleciłem tę funkcję
źródło
Najłatwiej to zrobić, używając operatora trójskładnikowego:
ale jeśli ciąg, który chcesz porównać, znajduje się w tablicy, użyjesz filtru es6
powyższe sprawdzi twój stringArray i dowolny ciąg pasujący do niego z tablicy, która w naszym przypadku wybraliśmy „boys”
źródło
Podczas testów wymyśliłem alternatywne rozwiązanie. możesz użyć funkcji na prototypie łańcucha.
działa dobrze w przeglądarkach Chrome
źródło
==
.