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 nullsont tous considérés comme des objets ( nullc'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 undefinedne 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, Numberet Stringrespectivement 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):NumberStringinstanceoffalse
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 typeofet instanceofsont insuffisants pour tester si une valeur est un booléen, un nombre ou une chaîne - typeofne fonctionne que pour les booléens primitifs, les nombres et les chaînes; et instanceofne 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 typeofla valeur. Nous pouvons utiliser Object.prototype.toStringpour créer notre propre version (plus utile) de l' typeofopé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