Une adresse commence-t-elle par https://, un chemin par /admin, un rôle par ROLE_ : ces vérifications se font des dizaines de fois dans une application, souvent au moment de décider qui a le droit de voir quoi.
startsWith et son symétrique endsWith répondent par vrai ou faux, sans détour par un index à comparer.
Définition
startsWith(texte) rend true quand la String (chaîne de caractères) commence exactement par le texte donné. endsWith(texte) fait la même vérification à la fin.
const url = "https://believemy.com/fr/glossaires";
console.log(url.startsWith("https://")); // true
console.log(url.startsWith("http://")); // false
console.log(url.endsWith("/glossaires")); // true
console.log("rapport.pdf".endsWith(".pdf")); // trueLes deux méthodes rendent toujours un booléen, ce qui les rend directement utilisables dans un if ou dans un Array.filter().
La casse compte, et la position se règle
La comparaison est exacte. Une majuscule de différence suffit à obtenir false, ce qui est souhaitable sur un préfixe technique et gênant sur du texte saisi.
console.log("Bonjour".startsWith("bonjour")); // false
console.log("Bonjour".toLowerCase().startsWith("bonjour")); // true
console.log("abcdef".startsWith("cd", 2)); // true, on démarre à l'index 2Le second argument de startsWith déplace le point de départ, celui de endsWith fait l'inverse : il indique où considérer que la chaîne se termine. "abcdef".endsWith("cd", 4) rend donc true, puisque seuls les quatre premiers caractères sont examinés.
Où ces méthodes servent vraiment
- Sécuriser une redirection en vérifiant que l'adresse commence par votre domaine, plutôt que de la suivre les yeux fermés.
- Router une requête en testant si le chemin commence par
/adminou par un code de langue. - Filtrer des fichiers avec
endsWithsur l'extension, ce qui reste plus lisible qu'un découpage sur le point. - Reconnaître un préfixe métier comme
ROLE_oucus_, très fréquent dans les identifiants d'API.
const fichiers = ["cours.pdf", "notes.txt", "facture.pdf"];
console.log(fichiers.filter((f) => f.endsWith(".pdf"))); // [ 'cours.pdf', 'facture.pdf' ]Questions fréquentes
startsWith ou indexOf(texte) === 0 ?
Le résultat est le même, la lisibilité ne l'est pas. startsWith dit ce qu'il fait, là où la comparaison à zéro demande un temps de lecture et se prête aux inversions de logique décrites dans indexOf(). La forme ancienne ne se justifie plus que sur des environnements très anciens.
Peut-on lui passer une expression régulière ?
Non, et l'erreur est explicite : une TypeError est levée si le premier argument est une RegExp. Pour tester un début avec un motif, utilisez la méthode test de l'expression, avec l'ancre ^ qui signifie « début de chaîne ».
Comment tester plusieurs préfixes d'un coup ?
En posant la liste dans un tableau et en interrogeant avec Array.some() : prefixes.some((p) => chemin.startsWith(p)). La même écriture avec every vérifierait que tous les préfixes correspondent, ce qui n'a évidemment pas de sens ici, un seul début étant possible.