Qual è il modo corretto per verificare la parità tra le stringhe in JavaScript?
{} == "[object Object]"true, ad esempio.
String().equals()non sia un metodo in JS ...
Qual è il modo corretto per verificare la parità tra le stringhe in JavaScript?
{} == "[object Object]"true, ad esempio.
String().equals()non sia un metodo in JS ...
Risposte:
sempre Fino a quando non comprendi appieno le differenze e le implicazioni dell'uso deglioperatori==e===, usa l'===operatore poiché ti salverà da bug e WTF oscuri (non ovvi). L'==operatore"normale"può avere risultati molto inaspettati a causa della coercizione del tipo internamente, quindi l'utilizzo===è sempre l'approccio raccomandato.
Per avere un'idea di ciò, e altre parti "buone contro cattive" di Javascript hanno letto il signor Douglas Crockford e il suo lavoro. C'è un ottimo discorso tecnico su Google in cui riassume molte buone informazioni: http://www.youtube.com/watch?v=hQVTIJBZook
Aggiornare:
La serie You Don't Know JS di Kyle Simpson è eccellente (e gratuita da leggere online). La serie va nelle aree del linguaggio comunemente fraintese e spiega le "parti cattive" che Crockford suggerisce di evitare. Comprendendoli puoi usarli correttamente ed evitare le insidie.
Il libro " Up & Going " include una sezione sull'uguaglianza , con questo riepilogo specifico di quando utilizzare gli operatori loose ( ==) vs strict ( ===):
Per ridurre tutti i dettagli in pochi semplici passaggi e aiutarti a sapere se utilizzare
==o===in varie situazioni, ecco le mie semplici regole:
- Se uno dei due valori (alias lato) in un confronto potrebbe essere il valore
trueofalse, evitare==e utilizzare===.- Se entrambi i valori in un confronto potrebbe essere di questi valori specifici (
0,""o[]- array vuoto), evitare==di usare===.- In tutti gli altri casi, sei sicuro da usare
==. Non solo è sicuro, ma in molti casi semplifica il codice in modo da migliorare la leggibilità.
Consiglio ancora il discorso di Crockford per gli sviluppatori che non vogliono investire il tempo per capire davvero Javascript: è un buon consiglio per uno sviluppatore che lavora solo occasionalmente in Javascript.
if (typeof foo == "string")
===operatore e non doversi mai preoccupare del "Sono davvero, totalmente, sicuro al 100% che ==si comporterà come penso?"
++/ --).
++o --o if/elsedichiarazioni a riga singola o continueo l' newoperatore o qualsiasi altro numero di pratiche di codice perfettamente legittime che Crockford ha ritenuto "dannose". E ovviamente mai e poi mai nemmeno pensare di usare evalo withanche se le loro insidie sono ben comprese. E hai visto la prossima versione di JS? Sintassi più rigorosa e una manciata di funzioni di supporto, alcune delle quali fluttuano da anni, è tutto ciò che otteniamo dopo tutto questo tempo. La sintassi non si è affatto evoluta. Se Crockford è dietro questo, allora è stata una brutta cosa.
Se sai che sono stringhe, non è necessario controllare il tipo.
"a" == "b"
Tuttavia, si noti che gli oggetti stringa non saranno uguali.
new String("a") == new String("a")
restituirà false.
Chiama il metodo valueOf () per convertirlo in una primitiva per oggetti String,
new String("a").valueOf() == new String("a").valueOf()
tornerà vero
new String("a") == "a"è vero (ma non lo sarebbe ===), perché il lato sinistro verrà convertito in un valore di stringa primitivo.
new String("a") == new String("a"), new String("a") === new String("b"), new String("a") === new String("a")tutti ritorneretefalse , dal momento che hai a che fare con i riferimenti a oggetti della Stringclasse, non primitive di tipo string.
new String(foo)crea una stringa oggetto e String(foo) converte foo in una primitiva stringa.
Solo un'aggiunta alle risposte: se tutti questi metodi restituiscono false, anche se le stringhe sembrano uguali, è possibile che ci sia uno spazio bianco a sinistra o a destra di una stringa. Quindi, basta inserire un .trim()alla fine delle stringhe prima di confrontare:
if(s1.trim() === s2.trim())
{
// your code
}
Ho perso ore a cercare di capire cosa c'è che non va. Spero che questo possa aiutare qualcuno!
fetch). Molte grazie.
ciò che mi ha portato a questa domanda è il paddingewhite-spaces
controlla il mio caso
if (title === "LastName")
doSomething();
e il titolo era " LastName"
quindi forse devi usare la
trimfunzione in questo modo
var title = $(this).text().trim();
.toString().trim()in Typescript
A meno che tu non sappia davvero come funziona la coercizione, dovresti invece evitare ==e utilizzare l'operatore di identità ===. Ma dovresti leggere questo per capire come funziona .
Se lo usi ==, lasci che la lingua faccia qualche tipo di coercizione per te, quindi ad esempio:
"1" == 1 // true
"0" == false // true
[] == false // true
Come ha detto Douglas Crockford nel suo libro:
È sempre meglio usare l'operatore di identità.
{}==" "mi hai dato Unexpected token ==qual è il modo corretto di farlo?
Esistono due modi in cui è possibile creare stringhe in javascript.
var str = 'Javascript'; Questo crea un valore di stringa primitivo.
var obj = new String('Javascript');Questo crea un oggetto wrapper di tipo String.
typeof str // string
typeof obj // object
Quindi il modo migliore per verificare l'uguaglianza è usare il === operatore perché controlla sia il valore che il tipo di entrambi gli operandi.
Se si desidera verificare l'uguaglianza tra due oggetti, l'utilizzo String.prototype.valueOfè corretto.
new String('javascript').valueOf() == new String('javascript').valueOf()
La stringa Objectspuò essere controllata usando il JSON.stringyfy()trucco.
var me = new String("me");
var you = new String("me");
var isEquel = JSON.stringify(me) === JSON.stringify(you);
console.log(isEquel);
Il modo più semplice per farlo è usare un operatore ternario in questo modo:
"was" == "was" ? true : false
ma se la stringa che desideri confrontare si trova in un array, utilizzerai il filtro es6
let stringArray = ["men", "boys", "girls", "sit", "can", "gotten"]
stringArray.filter(I=> I === boys ?
stringArray.pop(indexOf(I)) : null)
quanto sopra controllerà il tuo stringArray e qualunque stringa che lo corrisponda dall'array che nel nostro caso abbiamo scelto "ragazzi"
Ho trovato una soluzione alternativa durante i test. è possibile utilizzare la funzione sul prototipo di stringa.
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
funziona bene nei browser Chrome
==.