Logo JavaScript

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

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 !

Flattr this!

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.

Articles liés