Logo JavaScript

true === /abc/.test(function(){abc;})

Print Friendly and PDF
flattr this!

Bon alors au début, je voulais intituler ce post :

/42/.test(function(){42;}) === /abc/.test(function(){abc;}) !== /abc/.test(function(){42;})

Mais c'était un peu trop long et ça cassait la charte graphique. Puis je me suis dit que ça serait abusé pour vous quand vous alliez croire à un truc super technique alors que c'est tout pourri ;)

Je sais plus où j'ai vu passer ça mais il y avait quelqu'un sur Twitter qui demandait pourquoi :

(/abc/.test(function(){abc;}) ? "ok" : "nok") === "ok"

On va faire simple, test() permet de comparer son paramètre avec l'expression rationnelle qui sert d'objet appelant. En gros, dans l'exemple suivant, A est une regex, B est la cible à vérifier.

A.test(B)

L'astuce c'est qu'au dessus, on ne transmet pas une chaîne mais une fonction. Par défaut, test exploite son paramètre ou l'équivalent toString si celui-ci n'est pas une chaîne.

Or, faites un toString sur une fonction :

var toto = function(){abc;};
toto.toString(); // "function (){abc;}"

Du coup, quand vous allez exécuter le code suivant :

/abc/.test(function(){abc;})

En réalité, vous testez ceci :

/abc/.test("function(){abc;}")

Ce qui est forcément vrai du coup. Et voilà pourquoi !

A propos de Mathieu

Ingénieur développeur web dans la vente par correspondance B2B, adepte de nouvelles technologies et d'innovation. Vous pouvez aussi me retrouver sur Twitter @mathrobin
Cette entrée a été publiée dans JavaScript, avec comme mot(s)-clef(s) , . Vous pouvez la mettre en favoris avec ce permalien.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Articles liés