l' Object.prototype.toString
est un bon moyen, mais sa performance est le pire.
http://jsperf.com/check-js-type
Utiliser typeof
pour résoudre certains problème de base(String, Number, Boolean,...) et utiliser Object.prototype.toString
de résoudre quelque chose de complexe(Tableau, la Date, la RegExp).
et c'est ma solution:
var type = (function(global) {
var cache = {};
return function(obj) {
var key;
return obj === null ? 'null' // null
: obj === global ? 'global' // window in browser or global in nodejs
: (key = typeof obj) !== 'object' ? key // basic: string, boolean, number, undefined, function
: obj.nodeType ? 'object' // DOM element
: cache[key = ({}).toString.call(obj)] // cached. date, regexp, error, object, array, math
|| (cache[key] = key.slice(8, -1).toLowerCase()); // get XXXX from [object XXXX], and cache it
};
}(this));
utiliser comme:
type(function(){}); // -> "function"
type([1, 2, 3]); // -> "array"
type(new Date()); // -> "date"
type({}); // -> "object"