Si vous avez déjà essayé d’utiliser typeof
en Javascript pour trouver le type d’un objet, vous avez dû vous rendre compte que cet opérateur n’aide pas beaucoup….
Le typeof par défaut de Javascript
Déjà, comme typeof
est un opérateur, vous n’avez pas besoin d’utiliser des parenthèses ou une quelconque autre décoration.
Ainsi on aura :
typeof 2; // -> "number"
typeof "Kodono"; // -> "string"
On peut remarquer qu’ici typeof
nous a bien donné ce qu’on attendait… mais voilà ce qu’il se passe avec d’autres exemples :
typeof []; // -> "object"
typeof new Boolean(true); // -> "object"
typeof /a/; // -> "object"
typeof new Date(); // -> "object"
typeof null; // -> "object"
Comme on peut le voir, l’opérateur va fournir un « object » dans de nombreuses situations, ce qui n’aide pas du tout.
Créer un meilleur typeof
Pour faire court, on peut appliquer Object.prototype.toString.call
à un objet qui va retourner une chaine au format « [object Class] ». Quelques exemples :
Object.prototype.toString.call(new Number(2)); // -> [object Number]
Object.prototype.toString.call(new Date()); // -> [object Date]
Object.prototype.toString.call(/a/); // -> [object RegExp]
Maintenant que l’on sait ça on peut créer notre propose fonction typeOf
(en sachant que Object.prototype
peut se raccourcir par ({})/
).
On trouve sur Internet différentes façons de faire que je vais vous proposer.
La plus lente
Elle n’est pas très rapide (dûe à l’utilisation des expressions régulières), mais elle est très courte :
function typeOf(obj){return({}).toString.call(obj).match(/\s(\w+)/)[1]}
console.log(typeOf(new Number(2))); // -> Number
console.log(typeOf(new Date())); // -> Date
console.log(typeOf("test")); // -> String
console.log(typeOf(null)); // -> Null
console.log(typeOf(/a/)); // -> RegExp
console.log(typeOf([])); // -> Array
console.log(typeOf(function(){})); // -> Function
jQuery.type
Si vous utilisez déjà jQuery, vous pouvez utiliser la fonction jQuery.type qui propose une fonction assez rapide et efficace.
Ils utilisent la méthode suivante :
function typeOf(obj){
var c2t={"[object Boolean]":"Boolean","[object Number]":"Number","[object String]":"String","[object Function]":"Function","[object Array]":"Array","[object Date]":"Date","[object RegExp]":"RegExp","[object Object]":"Object"};
return obj==null?String(obj):c2t[({}).toString.call(obj)]||"object";
}
console.log(typeOf(new Number(2))); // -> Number
console.log(typeOf(new Date())); // -> Date
console.log(typeOf("test")); // -> String
console.log(typeOf(null)); // -> Null
console.log(typeOf(/a/)); // -> RegExp
console.log(typeOf([])); // -> Array
console.log(typeOf(function(){})); // -> Function
La plus courte et rapide
Celle-ci ne prend que quelques caractères, et se veut rapide en plus !
function typeOf(obj) {return({}).toString.call(obj).slice(8,-1)}
console.log(typeOf(new Number(2))); // -> Number
console.log(typeOf(new Date())); // -> Date
console.log(typeOf("test")); // -> String
console.log(typeOf(null)); // -> Null
console.log(typeOf(/a/)); // -> RegExp
console.log(typeOf([])); // -> Array
console.log(typeOf(function(){})); // -> Function
Conclusion
Si vous utilisez déjà jQuery dans votre code, alors vous pouvez faire confiance à jQuery.type
, sinon je vous conseille la dernière fonction proposée :
function typeOf(obj) {return({}).toString.call(obj).slice(8,-1)}