Définissons le terme "objet" en Javascript . Selon le Documents MDN chaque valeur est soit un objet, soit une primitive :
primitif, valeur primitive
Une donnée qui n'est pas un objet et qui n'a pas de méthodes. JavaScript possède 5 types de données primitives : string, number, boolean, null, undefined.
Qu'est-ce qu'un primitif ?
3
'abc'
true
null
undefined
Qu'est-ce qu'un objet (c'est-à-dire pas une primitive) ?
Object.prototype
- tout ce qui descend de
Object.prototype
-
Function.prototype
Object
Function
-
function C(){}
-- fonctions définies par l'utilisateur
-
C.prototype
-- la propriété prototype d'une fonction définie par l'utilisateur : il s'agit de pas C
s prototype
-
new C()
-- "new"-ing une fonction définie par l'utilisateur
Math
-
Array.prototype
-
{"a": 1, "b": 2}
-- objets créés à l'aide de la notation littérale
-
new Number(3)
-- enveloppes autour des primitives
- ... beaucoup d'autres choses ...
Object.create(null)
- tout descend d'un
Object.create(null)
Comment vérifier si une valeur est un objet
instanceof
par lui-même ne fonctionnera pas, car il manque deux cas :
// oops: isObject(Object.prototype) -> false
// oops: isObject(Object.create(null)) -> false
function isObject(val) {
return val instanceof Object;
}
typeof x === 'object'
ne fonctionnera pas, à cause des faux positifs ( null
) et les faux négatifs (fonctions) :
// oops: isObject(Object) -> false
function isObject(val) {
return (typeof val === 'object');
}
Object.prototype.toString.call
ne fonctionnera pas, à cause des faux positifs pour toutes les primitives :
> Object.prototype.toString.call(3)
"[object Number]"
> Object.prototype.toString.call(new Number(3))
"[object Number]"
Donc j'utilise :
function isObject(val) {
if (val === null) { return false;}
return ( (typeof val === 'function') || (typeof val === 'object') );
}
La réponse de @Daan semble également fonctionner :
function isObject(obj) {
return obj === Object(obj);
}
car, selon le Documents MDN :
Le constructeur Object crée un objet enveloppant pour la valeur donnée. Si la valeur est nulle ou indéfinie, il créera et retournera un objet vide, sinon, il retournera un objet d'un type qui correspond à la valeur donnée. Si la valeur est déjà un objet, il retournera la valeur.
Une troisième méthode qui semble fonctionner (je ne suis pas sûr que ce soit à 100%) est d'utiliser Object.getPrototypeOf
dont lance une exception si son argument n'est pas un objet :
// these 5 examples throw exceptions
Object.getPrototypeOf(null)
Object.getPrototypeOf(undefined)
Object.getPrototypeOf(3)
Object.getPrototypeOf('abc')
Object.getPrototypeOf(true)
// these 5 examples don't throw exceptions
Object.getPrototypeOf(Object)
Object.getPrototypeOf(Object.prototype)
Object.getPrototypeOf(Object.create(null))
Object.getPrototypeOf([])
Object.getPrototypeOf({})
4 votes
Une variable est une variable. Elle peut faire référence à un objet. De plus, vous voudrez peut-être définir le terme "objet" - comme le montrent les réponses et les commentaires, il existe plusieurs définitions contradictoires (par exemple, le fait de savoir si
null
est un objet).8 votes
OP, IMO vous devriez accepter la réponse de @Daan car c'est la meilleure solution et elle devrait être listée au-dessus des autres réponses pour être vue en premier. (Sans vouloir offenser les autres qui ont aussi de bonnes réponses).
3 votes
IMHO, cela dépend vraiment de ce que vous (celui qui cherche une réponse à cette question) considérez comme un objet, et pourquoi vous le vérifiez. Cette question donne des réponses différentes si vous essayez de distinguer les Arrays (que les sont Objets) de autre Objets ou si vous essayez de séparer les valeurs scalaires des "vecteurs". Et si null (que est un Objet, selon le typeof) ou des Fonctions (qui sont Objets) doit être exclu ou non, cela dépend vraiment de la raison pour laquelle vous le vérifiez. C'est pourquoi il y a tant de réponses et la plupart d'entre elles, dans leur contexte, sont correctes.
0 votes
Const isEmpty = thing => { typeof thing === "object" ? !thing || !Object.keys(thing).length : !thing && thing !== 0 } ;
0 votes
Chaque définition en programmation est en conflit avec une autre définition. La définition qui a le plus de sens pour OP est
A javascript object is a javascript object such as '{}'
. Expliquez-moi pourquoi null serait considéré comme un objet ? Si vous considéreznull
un objet, vous pouvez tout aussi bien considérer chaque variable de javascript comme un objet.object
.1 votes
Ce serait bien si vous pouviez commencer par dire exactement ce que vous par "est un objet". (Ou bien, dites explicitement qu'une partie de la réponse que vous cherchez consiste à déterminer les diverses significations populaires de "est un objet", puis à les différencier). Sans cela, tout le monde se passe de commentaires.
1 votes
Que diriez-vous d'une réponse directe à l'adresse suivante stackoverflow.com/a/52478680/1096194 . J'ai écrit ce texte lorsque j'ai été bouleversé par la longueur des détails dans les réponses les plus votées. Je pense qu'il mérite beaucoup plus de visibilité.
0 votes
Dans Vue 3 (API de composition), lorsque j'utilise "typeof variable", j'obtiens toujours "Object" à cause du Proxy. Ensuite j'utilise juste un " if (variable.length)" -> pour Oblject ce sera "undefined" et vous pouvez utiliser l'instruction if.
0 votes
Très lié : stackoverflow.com/questions/38304401/ (dupe discutable)... et peut-être plus ce à quoi la plupart des gens qui trouvent cette page pensent, je suppose. C'est-à-dire qu'ils cherchent spécifiquement des dictionnaires. Enfin, c'est ce à quoi je pensais, en tout cas.
0 votes
Utilisez lodash _.isPlainObject qui couvre tous les cas d'utilisation de base et plus encore -. lodash.com/docs/#isPlainObject