Jaki jest prawidłowy sposób sprawdzenia równości między ciągami w JavaScript?
{} == "[object Object]"na przykład ma wartość true.
String().equals()nie jest to metoda w JS ...
Jaki jest prawidłowy sposób sprawdzenia równości między ciągami w JavaScript?
{} == "[object Object]"na przykład ma wartość true.
String().equals()nie jest to metoda w JS ...
Odpowiedzi:
zawsze Dopó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 ( ===):
Aby sprowadzić wiele szczegółów do kilku prostych dań na wynos i pomóc ci wiedzieć, czy użyć,
==czy===w różnych sytuacjach, oto moje proste zasady:
- Jeśli którakolwiek wartość (inaczej strona) w porównaniu może być wartością
truelubfalse, należy unikać==i używać===.- Jeśli wartość w porównaniu z nich może być konkretne wartości (
0,""lub[]- pusta tablica), należy unikać==i zastosowania===.- We wszystkich innych przypadkach możesz bezpiecznie używać
==. Jest nie tylko bezpieczny, ale w wielu przypadkach upraszcza kod w sposób poprawiający czytelność.
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.
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/elsecontinuenewevalwith
Jeśli wiesz, że są łańcuchami, nie ma potrzeby sprawdzania typu.
"a" == "b"
Należy jednak pamiętać, że obiekty łańcuchowe nie będą równe.
new String("a") == new String("a")
zwróci fałsz.
Wywołaj metodę valueOf (), aby przekształcić ją w operację podstawową dla obiektów String,
new String("a").valueOf() == new String("a").valueOf()
zwróci prawdę
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 zwrot false, ponieważ masz do czynienia z odniesieniami do obiektów w Stringklasie, a nie prymitywów typu string.
new String(foo)tworzy obiekt łańcuchowy i String(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:
if(s1.trim() === s2.trim())
{
// your code
}
Straciłem godziny, próbując dowiedzieć się, co jest nie tak. Mam nadzieję, że to komuś pomoże!
fetch). Wielkie dzięki.
to, co doprowadziło mnie do tego pytania, to paddingiwhite-spaces
sprawdź moją sprawę
if (title === "LastName")
doSomething();
i tytuł był " LastName"
więc może musisz użyć
trimtakiej funkcji
var title = $(this).text().trim();
.toString().trim()w
O 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:
"1" == 1 // true
"0" == false // true
[] == false // true
Jak powiedział Douglas Crockford w swojej książce:
Zawsze lepiej jest użyć operatora tożsamości.
{}==" "dał mi Unexpected 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 opakowania String.
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.valueOfpoprawnego sposobu.
new String('javascript').valueOf() == new String('javascript').valueOf()
Ciąg Objectsmożna sprawdzić za pomocą JSON.stringyfy()sztuczki.
var me = new String("me");
var you = new String("me");
var isEquel = JSON.stringify(me) === JSON.stringify(you);
console.log(isEquel);
Najłatwiej to zrobić, używając operatora trójskładnikowego:
"was" == "was" ? true : false
ale jeśli ciąg, który chcesz porównać, znajduje się w tablicy, użyjesz filtru es6
let stringArray = ["men", "boys", "girls", "sit", "can", "gotten"]
stringArray.filter(I=> I === boys ?
stringArray.pop(indexOf(I)) : null)
powyższe sprawdzi twój stringArray i dowolny ciąg pasujący do niego z tablicy, która w naszym przypadku wybraliśmy „boys”
Podczas testów wymyśliłem alternatywne rozwiązanie. możesz użyć funkcji na prototypie łańcucha.
String.prototype.betwenStr = function(one){
return JSON.stringify(new String(this)) === JSON.stringify(new String(one));
}
//call it
"hello world".betweenStr("hello world"); //returns boolean
//value
działa dobrze w przeglądarkach Chrome
==.