En JavaScript, tout est un objet (ou peut au moins être traité comme un objet), à l'exception des primitives (booléens, null, nombres, chaînes et la valeur undefined
(et le symbole dans ES6)):
console.log(typeof true); // boolean
console.log(typeof 0); // number
console.log(typeof ""); // string
console.log(typeof undefined); // undefined
console.log(typeof null); // object
console.log(typeof []); // object
console.log(typeof {}); // object
console.log(typeof function () {}); // function
Comme vous pouvez le voir, les tableaux et la valeur null
sont tous considérés comme des objets ( null
c'est une référence à un objet qui n'existe pas). Les fonctions se distinguent parce qu'elles sont un type spécial d' objets appelables . Mais ce sont toujours des objets.
D'autre part , les littéraux true
, 0
, ""
et undefined
ne sont pas des objets. Ce sont des valeurs primitives en JavaScript. Cependant, les booléens, les nombres et les chaînes ont également des constructeurs Boolean
, Number
et String
respectivement qui enveloppent leurs primitives respectives pour fournir des fonctionnalités supplémentaires:
console.log(typeof new Boolean(true)); // object
console.log(typeof new Number(0)); // object
console.log(typeof new String("")); // object
Comme vous pouvez le voir lorsque les valeurs primitives sont enveloppées respectivement dans les constructeurs et Boolean
, elles deviennent des objets. L' opérateur ne fonctionne que pour les objets (c'est pourquoi il retourne pour les valeurs primitives):Number
String
instanceof
false
console.log(true instanceof Boolean); // false
console.log(0 instanceof Number); // false
console.log("" instanceof String); // false
console.log(new Boolean(true) instanceof Boolean); // true
console.log(new Number(0) instanceof Number); // true
console.log(new String("") instanceof String); // true
Comme vous pouvez voir les deux typeof
et instanceof
sont insuffisants pour tester si une valeur est un booléen, un nombre ou une chaîne - typeof
ne fonctionne que pour les booléens primitifs, les nombres et les chaînes; et instanceof
ne fonctionne pas pour les booléens primitifs, les nombres et les chaînes.
Heureusement, il existe une solution simple à ce problème. L'implémentation par défaut de toString
(c'est-à-dire telle qu'elle est définie de manière native sur Object.prototype.toString
) renvoie la [[Class]]
propriété interne des valeurs primitives et des objets:
function classOf(value) {
return Object.prototype.toString.call(value);
}
console.log(classOf(true)); // [object Boolean]
console.log(classOf(0)); // [object Number]
console.log(classOf("")); // [object String]
console.log(classOf(new Boolean(true))); // [object Boolean]
console.log(classOf(new Number(0))); // [object Number]
console.log(classOf(new String(""))); // [object String]
La [[Class]]
propriété interne d'une valeur est beaucoup plus utile que typeof
la valeur. Nous pouvons utiliser Object.prototype.toString
pour créer notre propre version (plus utile) de l' typeof
opérateur comme suit:
function typeOf(value) {
return Object.prototype.toString.call(value).slice(8, -1);
}
console.log(typeOf(true)); // Boolean
console.log(typeOf(0)); // Number
console.log(typeOf("")); // String
console.log(typeOf(new Boolean(true))); // Boolean
console.log(typeOf(new Number(0))); // Number
console.log(typeOf(new String(""))); // String
J'espère que cet article vous a aidé. Pour en savoir plus sur les différences entre les primitives et les objets encapsulés, lisez le billet de blog suivant: La vie secrète des primitives JavaScript