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ą
true
lubfalse
, 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/else
continue
new
eval
with
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 String
klasie, 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 padding
iwhite-spaces
sprawdź moją sprawę
if (title === "LastName")
doSomething();
i tytuł był " LastName"
więc może musisz użyć
trim
takiej 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.valueOf
poprawnego sposobu.
new String('javascript').valueOf() == new String('javascript').valueOf()
Ciąg Objects
moż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
==
.