163 votes

Le moyen le plus précis de vérifier le type d'objet JS?

comme vous le savez - l'opérateur typeof ne nous aide pas vraiment à trouver le type réel d'un objet.

J'ai rencontré le code suivant:

 Object.prototype.toString.apply(t)  
 

qui me dit excatly quel est le vrai type.

La question: est-ce le moyen le plus précis?

ps il y a une autre question ici sur StackOverFlow - mais seulement avec une réponse qui est le code de fonction de grande taille de quelqu'un d'autre qui vérifie.

il suppose être 1,2 lignes .. non? :)

221voto

kmatheny Points 1448

La spécification JavaScript donne exactement un moyen approprié de déterminer la classe d'un objet:

 Object.prototype.toString.call(t);
 

http://bonsaiden.github.com/JavaScript-Garden/#types

66voto

wiky Points 773

l' Object.prototype.toString est un bon moyen, mais sa performance est le pire.

http://jsperf.com/check-js-type

check js type performance

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"

12voto

Raynos Points 82706
 var o = ...
var proto =  Object.getPrototypeOf(o);
proto === SomeThing;
 

Gardez une main sur le prototype que vous attendez de l'objet, puis comparez-le.

par exemple

 var o = "someString";
var proto =  Object.getPrototypeOf(o);
proto === String.prototype; // true
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X