1153 votes

Quelle est la manière correcte de vérifier l'égalité des chaînes de caractères en JavaScript ?

Quelle est la manière correcte de vérifier l'égalité entre des chaînes de caractères en JavaScript ?

7 votes

Y a-t-il une raison de ne pas utiliser == ?

30 votes

@Kendrick -- bien sûr. Son système de coercion de type peut être incroyablement peu intuitif et peut rendre les erreurs très faciles à négliger (il regarde juste, mais peut être très erronée)

30 votes

@Kendrick - parce que {} == "[object Object]" évalue à true, par exemple.

812voto

STW Points 15326

toujours Jusqu'à ce que vous compreniez parfaitement les différences et les implications de l'utilisation de l'option == et === utiliser les opérateurs === car il vous épargnera des bogues obscurs (non évidents) et des WTF. L'opérateur "régulier" == peut donner des résultats très inattendus en raison de la coercition interne entre les types. === est toujours l'approche recommandée.

Pour en savoir plus sur ce sujet et sur d'autres aspects "bons ou mauvais" de Javascript, lisez les articles de M. Douglas Crockford et son travail. Il y a un excellent Google Tech Talk où il résume beaucoup de bonnes informations : http://www.youtube.com/watch?v=hQVTIJBZook


Mise à jour :

Le site Vous ne connaissez pas JS de Kyle Simpson est excellente (et peut être lue gratuitement en ligne). Cette série aborde les aspects les plus souvent mal compris de la langue et explique les "mauvaises parties" que Crockford vous suggère d'éviter. En les comprenant, vous pouvez les utiliser correctement et éviter les pièges.

Le " En route "Le livre comprend une section sur Égalité avec ce résumé spécifique sur le moment où il faut utiliser la loose ( == ) contre strict ( === ) :

Pour résumer toute une série de détails en quelques points simples à retenir et vous aider à savoir si vous devez utiliser == ou === dans diverses situations, voici mes règles simples :

  • Si l'une ou l'autre valeur (alias côté) d'une comparaison peut être le true ou false valeur, éviter == et utiliser === .
  • Si l'une des deux valeurs d'une comparaison peut être l'une de ces valeurs spécifiques ( 0 , "" ou [] -- tableau vide), éviter == et utiliser === .
  • Sur tous Dans les autres cas, vous pouvez utiliser == . Non seulement il est sûr, mais dans de nombreux cas, il simplifie votre code de manière à en améliorer la lisibilité.

Je continue à recommander la conférence de Crockford aux développeurs qui ne veulent pas investir le temps nécessaire pour vraiment comprendre Javascript - c'est un bon conseil pour un développeur qui ne travaille qu'occasionnellement en Javascript.

8 votes

Ce n'est pas nécessaire lorsque vous êtes sûr que les deux opérandes sont des chaînes de caractères, par exemple lorsque vous utilisez if (typeof foo == "string")

40 votes

@Marcel -- vous avez raison, mais c'est beaucoup mieux de toujours utiliser le === et ne jamais avoir à se soucier de la question "suis-je vraiment, totalement, 100% certain que == se comportera comme je le pense ?"

1 votes

Il y a certains cas où il faudra toujours soit une chaîne de caractères, ce qui fait que === et son impact (infinitésimal) sur les performances est inutile. La première est typeof ce qui garantit le retour d'une chaîne de caractères. Un autre cas qui me vient à l'esprit est celui de l'itération sur un ensemble de clés dans un objet - bien entendu, la comparaison avec cet objet a également son importance. Ce sont des cas où vous n'avez pas besoin de "réfléchir" parce que c'est garanti. Je pense que pour un débutant, ce n'est pas une mauvaise idée d'utiliser la fonction === mais si vous êtes expérimenté et que vous connaissez bien la spécification, vous pouvez renoncer à utiliser === sans risque.

266voto

Anurag Points 66470

Si vous savez qu'il s'agit de chaînes de caractères, il n'est pas nécessaire de vérifier le type.

"a" == "b"

Toutefois, notez que les objets de type chaîne ne seront pas égaux.

new String("a") == new String("a")

retournera faux.

Appelez la méthode valueOf() pour la convertir en primitive pour les objets String,

new String("a").valueOf() == new String("a").valueOf()

retournera vrai

0 votes

Vous voulez dire new String("a") == new String("a") retournera false ? Qu'en est-il de new String("a") === new String("b") ?

5 votes

Merci pour cela JSS, deux objets de type chaîne ne seront jamais égaux à moins qu'ils ne soient le même objet, quelle que soit la valeur.

6 votes

@JSS : En outre, new String("a") == "a" est vrai (mais ne le serait pas avec === ), car le côté gauche sera converti en une valeur de chaîne primitive.

109voto

Kamil Kiełczewski Points 6496

Vous pouvez utiliser == ou === mais le dernier fonctionne de manière plus simple ( src )

a == b (et sa négation != )

enter image description here

a === b (et sa négation !== )

enter image description here

22 votes

Au moins, '==' est symétrique... |-=)

0 votes

@Lars pas exactement : if("0"==0 && 0==[]) console.log("0"==[]);

1 votes

Je voulais dire que si a==b alors b==a pour tous les a et b.

89voto

AKelec Points 91

Juste un ajout aux réponses : Si toutes ces méthodes renvoient faux, même si les chaînes semblent être égales, il est possible qu'il y ait un espace blanc à gauche et ou à droite d'une chaîne. Alors, il suffit de mettre un .trim() à la fin des chaînes de caractères avant de les comparer :

if(s1.trim() === s2.trim())
{
    // your code
}

J'ai perdu des heures à essayer de comprendre ce qui ne va pas. J'espère que cela aidera quelqu'un !

1 votes

Merci beaucoup. C'est quand même étrange pour moi, car je me suis assuré qu'il n'y avait pas d'espace à gauche ou à droite et pourtant c'était la seule façon de résoudre mon problème. Peut-être est-ce lié à la représentation interne d'une chaîne de caractères ?

2 votes

Merci @akelec ! !! @Niko, c'était probablement dû au caractère Zero-Width-Space qui est invisible à l'œil nu. Voir fr.wikipedia.org/wiki/Zero-width_space (espace de largeur zéro) . Même si ce caractère a son utilité, de nombreux développeurs n'apprécient pas son existence !

1 votes

Merci, c'était frustrant car la vérification de l'égalité dans mon if échouait alors que je ne voyais pas d'espace blanc en inspectant pendant le débogage.

31voto

Basheer AL-MOMANI Points 5565

Ce qui m'a conduit à cette question est le padding et white-spaces

vérifier mon dossier

 if (title === "LastName")
      doSomething();

et le titre était " LastName"

enter image description here

donc peut-être que vous devez utiliser trim comme ceci

var title = $(this).text().trim();

2 votes

Merci, même chose ici, j'ai utilisé .toString().trim() dans Typescript

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X