3495 votes

Comment vérifier une chaîne vide/non définie/null en JavaScript?

Y a-t-il un string.Empty en JavaScript, ou est-ce simplement une question de vérification pour ""?

4 votes

Juste pour info, je pense que les API les plus utiles pour la classe String se trouvent sur Mozilla et javascript kit. [elated.com](elated.com/articles/working-with-strings ) propose un tutoriel sur toutes les propriétés et méthodes de String,... Veuillez noter : le lien Mozilla a été mis à jour sur developer.mozilla.org/en/JavaScript/Reference/Global_Objects‌​/…

0 votes

1 votes

Il serait très utile si l'exigence était clairement spécifiée. Pour quelles valeurs isEmpty devrait-il retourner vrai? Vérifier pour "" suppose que cela devrait uniquement retourner vrai si la valeur est de type chaîne et de longueur 0. De nombreuses réponses ici supposent qu'il devrait également retourner vrai pour certaines ou toutes les valeurs "fausses".

4324voto

bdukes Points 54833

Chaîne vide, indéfinie, nulle, ...

Pour vérifier une valeur truthy:

if (strValue) {
    // strValue était une chaîne non vide, true, 42, Infinity, [], ...
}

Pour vérifier une valeur falsy:

if (!strValue) {
    // strValue était une chaîne vide, false, 0, null, undefined, ...
}

Chaîne vide (uniquement!)

Pour vérifier exactement une chaîne vide, comparez avec une égalité stricte à "" en utilisant l'opérateur ===:

if (strValue === "") {
    // strValue était une chaîne vide
}

Pour vérifier strictement une chaîne non vide, utilisez l'opérateur !==:

if (strValue !== "") {
    // strValue n'était pas une chaîne vide
}

239 votes

Tester la propriété de longueur peut en fait être plus rapide que de tester la chaîne contre "", car l'interpréteur n'aura pas à créer un objet String à partir du littéral de chaîne.

62 votes

@Vincent réalise un profilage naïf dans les outils de développement de Chrome, en testant === '' vs .length n'a montré aucune amélioration discernable (et l'utilisation de .length fonctionne uniquement si vous pouvez supposer que vous avez une chaîne de caractères)

37 votes

@bdukes lorsque vous commencez à vous soucier de ce genre de micro-optimisations, je ne pense pas que Chrome soit le navigateur où vous rencontrez la plupart de vos problèmes de performance...

1332voto

Jano González Points 3180

Pour vérifier si une variable est fausse ou si elle a un attribut length égal à zéro (ce qui pour une chaîne de caractères signifie qu'elle est vide), j'utilise :

function isEmpty(str) {
    return (!str || str.length === 0 );
}

(Notez que les chaînes de caractères ne sont pas les seules variables avec un attribut <code>length</code>, les tableaux en ont aussi, par exemple.)

Alternativement, vous pouvez utiliser le chaînage facultatif (pas si) récent et les fonctions fléchées pour simplifier :

const isEmpty = (str) => (!str?.length);

Cela vérifiera la longueur, renvoyant undefined en cas de valeur nulle, sans générer d'erreur. Dans le cas d'une valeur vide, zéro est falsy et le résultat est toujours valable.

Pour vérifier si une variable est fausse ou si la chaîne de caractères contient seulement des espaces vides ou est vide, j'utilise :

function isBlank(str) {
    return (!str || /^\s*$/.test(str));
}

Si vous le souhaitez, vous pouvez monkey-patcher le prototype String de cette manière :

String.prototype.isEmpty = function() {
    // Cela ne fonctionne pas de la même manière que la fonction isEmpty utilisée
    // dans le premier exemple, elle renverra vrai pour les chaînes contenant uniquement des espaces vides
    return (this.length === 0 || !this.trim());
};
console.log("example".isEmpty());

Remarquez que le monkey-patching des types intégrés est controversé, car cela peut casser le code qui dépend de la structure existante des types intégrés, pour n'importe quelle raison.

43 votes

Pourquoi 0 === str.length au lieu de str.length === 0 ?

115 votes

@Vincent Les conditions sont souvent écrites comme ceci if (variable == valeur constante) et si vous oubliez un '=', vous assignez la valeur constante à la variable au lieu de la tester. Le code fonctionnera quand même car vous pouvez assigner une variable dans un if. Une manière plus sûre d'écrire cette condition est d'inverser la valeur constante et la variable. De cette façon, lorsque vous testerez votre code, vous verrez une erreur (Côté gauche de l'affectation invalide). Vous pouvez également utiliser quelque chose comme JSHint pour interdire l'affectation dans les conditions et être averti lorsque vous en écrivez une.

0 votes

J'ai oublié de mentionner que comme vous utilisez principalement '===' ou '!==' vous êtes moins exposé à ce type d'erreur.

473voto

karthick.sk Points 421

Toutes les réponses précédentes sont bonnes, mais ceci sera encore meilleur. Utilisez des opérateurs NOT double (!!):

if (!!str) {
    // Du code ici
}

Ou utilisez la conversion de type:

if (Boolean(str)) {
    // Code ici
}

Les deux font la même fonction. Convertissez la variable en type Boolean, où str est une variable.

  • Cela renvoie false pour null, undefined, 0, 000, "", false.

  • Cela renvoie true pour toutes les valeurs de chaîne autres que la chaîne vide (y compris des chaînes comme "0" et " ")

80 votes

Pourquoi est-ce "encore mieux"?

2 votes

Ce n'est pas un joli tour, c'est la façon dont cela devrait être fait. C'est la bonne manière. Javascript définit la valeur de "" et de null comme fausse.

47 votes

Y a-t-il une différence entre le comportement de if(str) et if(!!str)?

125voto

Ates Goral Points 47670

La chose la plus proche à str.Empty (avec la condition préalable que str est une chaîne de caractères) est :

if (!str.length) { ...

22 votes

Ne lancerait-il pas une exception si str est nul?

7 votes

@PicMickael Oui ! Ainsi le ferait str.Empty.

0 votes

Notez que les chaînes de caractères ne sont pas le seul type de variable à avoir un attribut length. Les tableaux en ont également un.

111voto

Sugendran Points 1434

Si vous avez besoin de vous assurer que la chaîne n'est pas juste une série d'espaces vides (je suppose que c'est pour la validation de formulaire), vous devez effectuer un remplacement des espaces.

if(str.replace(/\s/g,"") == ""){
}

8 votes

Mais fait le travail si ce que vous voulez réellement tester est une chaîne de caractères avec du contenu non blanc. Y a-t-il un moyen moins onéreux de tester ceci?

4 votes

Que dire de la propriété length?

28 votes

Au lieu de supprimer tous les espaces, pourquoi ne pas simplement vérifier s'il y a un caractère qui n'est pas un espace ? Cela présente 2 avantages : cela peut interrompre le processus prématurément s'il y a un caractère qui n'est pas un espace, et vous n'avez pas besoin de renvoyer une nouvelle chaîne de caractères que vous devez ensuite vérifier. if(str.match(/\S/g)){}

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