La façon la plus efficace de vérifier si la variable est Tableau ou d'un Objet (en NodeJS & V8)?
Est-il un moyen efficace de vérifier si la variable est un Objet ou un Tableau, en NodeJS & V8?
Je suis en train d'écrire un Modèle pour MongoDB et NodeJS, et de parcourir l'arborescence de l'objet j'ai besoin de savoir si l'objet est simple (Nombre, Chaîne, ...) ou composite (Hachage, Array).
Il semble que le V8 a vite intégré dans Array.isArray
, mais comment faire pour vérifier si l'objet est un Objet? Je veux dire objet complexe comme hachage {}
ou une instance de la classe, et pas quelque chose comme new String()
?
Habituellement, il peut être fait comme ceci:
Object.prototype.toString.call(object) == "[object Object]"
ou ceci:
object === Object(object)
Mais il semble que ces opérations ne sont pas bon marché, peut-être il y a un peu plus efficace? C'est ok si il n'est pas universel et ne fonctionne pas sur tous les moteurs, j'en ai besoin seulement de travailler sur la V8.
- Merci pour l'aide, par la façon dont le modèle lui-même est ici alexeypetrushin.github.com/mongo-model/presentations/...
- Ces deux opérations devraient être assez bon marché. Si vous voulez savoir si quelque chose peut être utilisé comme un objet (peut obtenir/définir des propriétés, etc.) utilisation
x === Object(x)
mais si vous voulez des tests plus précis, utilisezObject.prototype.toString.call(x)
. Ne vous inquiétez pas à propos de la vitesse de la soit un, pas sans profilage d'abord. - Est-il une raison
typeof x
est un mauvais choix? Il sera de retour "chaîne" pour une chaîne de caractères et 'objet' d'un objet. typeof []
retourne"object"
- Double Possible de Vérifier si une valeur est un objet en JavaScript
Vous devez vous connecter pour publier un commentaire.
Tous les objets sont des instances d'au moins une classe –
Object
– en ECMAScript. Vous ne pouvez distinguer entre les instances de classes et les objets normaux à l'aide deObject#toString
. Ils ont tous le même niveau de complexité, par exemple, s'ils sont créés à l'aide de{}
ou lanew
opérateur.Object.prototype.toString.call(object)
est votre meilleur pari pour différencier les objets normaux et les instances des autres classes intégrées, commeobject === Object(object)
ne fonctionne pas ici. Cependant, je ne vois pas la raison pourquoi vous avez besoin de faire ce que vous faites, peut-être, si vous partagez le cas d'utilisation je peux offrir un peu plus d'aide.Pour une simple vérification à l'encontre de l'Objet ou un Tableau sans autre appel de fonction (vitesse).
isArray()
isObject()
return (a)&&(a.constructor === Array)
? @zupa(a) && (a.constructor === Array)
ne fonctionnera pas sia=null
...a
estundefined
ounull
puisundefined
ounull
sera retourné. S'ils sont falsy valeurs et travailler enif
états... dans le cas de l'exempleundefined
ounull
serait connecté à la place detrue
oufalse
.Si ses juste au sujet de la détection de savoir si ou non vous faites affaire avec un
Object
, je penseCependant, ce serait sans doute l'échec de la non-objet de valeurs primitives. En fait il n'y a rien de mal avec l'invocation
.toString()
pour récupérer le [[cclass]] propriété. Vous pouvez même créer une belle syntaxe commeet de l'utiliser ensuite comme
Il pourrait ne pas être le plus rapide de l'opération, mais je ne pense pas que la performance de fuite, il est trop grand.
bind
en fait il est beaucoup plus lent, ce qui est une honte parce que c'est quelque chose qui semble comme il pourrait être optimisée beaucoup mieux sous le capot.Array.isArray
.isArray
ne peut pas se faire battre, mais je pense que l'OP voulait vérifier la présence d'une instance d'objet de manière explicite.underscore.js est l'aide de l'suivantes
obj === Object(obj);
il pourrait êtreobj.constructor === Object.prototype.constructor
Object
sur quelque chose qui est déjà un objet:The result is the input argument (no conversion).
c'est pourquoi il est===
à l'objet d'origine. Donc, il devrait être très rapide.false
sur tout ce qui n'est pas directement une instance deObject
, ce qui signifie qu'il renvoiefalse
sur les Tableaux, les Fonctions, les expressions régulières, des objets personnalisés, etc.- Je utiliser
typeof
afin de déterminer si la variable, je suis à la recherche d'un objet. Si c'est puis-je utiliserinstanceof
de déterminer quel genre il estnull
est techniquement la bonne façon de représenter un "manque" de l'objet. Ayanttypeof null == 'object'
est en fait très bien à mon avis. De la même manièretypeof NaN == 'number'
ettypeof undefined == 'undefined'
.typeof
parce quetypeof new String("foo")
sera de retour"object"
au lieu de"string"
. En va de même pourtypeof null
,typeof new Number()
,typeof new Boolean()
, etc... Ils sont tous de retour"object"
.instanceof
->new String("foo") instanceof String
sera de retourtrue
.Salut, je sais que ce sujet est vieux, mais il est un bien meilleur moyen de différencier un Tableau dans Node.js de tout autre Objet ont un look à la docs.
La Meilleure Façon Que Je Peux Utiliser Mon Projet.Utilisation
hasOwnProperty
de Façon Délicate!.Viens de trouver une solution rapide et simple à découvrir le type d'une variable.
ES6
ES5
Exemples:
MODIFIER
Amélioration de prévenir 'undefined' et 'null' valeurs:
ES6
ES5
Si vous savez qu'un paramètre va certainement être soit un tableau ou un objet, il peut être plus facile de vérifier pour un tableau par rapport à la vérification d'un objet avec quelque chose comme ça.
regarder jQuery ils y
jQuery.isArray(...)
ils n':ce qui nous amène à:
jQuery.type
:et encore, nous avons à rechercher dans:
class2type
et en natif JS:
cela se termine par:
J'ai utilisé cette fonction à résoudre:
Je sais, ça fait un moment, mais j'ai pensé que je voudrais mettre à jour la réponse car il y a de nouvelles (plus rapide et plus simple des façons de résoudre ce problème.
Depuis ECMAscript 5.1 yo pouvez utiliser le
isArray()
méthode disponible dans leArray
classe.Yo peut le voir, c'est de la documentation dans MDN ici.
Je pense que vous ne devriez pas avoir un problème de compatibilité de nos jours, mais juste au cas où, si vous ajoutez ceci à votre code, vous devez toujours être sûr que
Array.isArray()
est polyfilled:Juste pour le record,
lodash
a également isObject(valeur)