In JavaScript ist alles ein Objekt (oder zumindest als ein Objekt behandelt werden), mit Ausnahme Primitiven (booleans, null, Zahlen, Strings und dem Wert undefined
(und das Symbol in 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
Wie Sie sehen können, werden Arrays und der Wert null
alle als Objekte betrachtet ( null
ist ein Verweis auf ein Objekt, das nicht existiert). Funktionen werden unterschieden, weil sie eine spezielle Art von aufrufbaren Objekten sind. Sie sind jedoch immer noch Objekte.
Auf der anderen Seite der Literale true
, 0
, ""
und undefined
sind nicht Objekte. Sie sind primitive Werte in JavaScript. Allerdings booleans, Zahlen und Strings auch Konstrukteure haben Boolean
, Number
und String
jeweils die ihre jeweiligen Primitiven wickeln zusätzliche Funktionen bereitzustellen:
console.log(typeof new Boolean(true)); // object
console.log(typeof new Number(0)); // object
console.log(typeof new String("")); // object
Wie Sie sehen können , wenn primitive Werte innerhalb der umhüllte sind Boolean
, Number
und String
Konstrukteuren bzw. werden sie Objekte. Der instanceof
Operator arbeitet nur für Objekte (weshalb er false
für primitive Werte zurückgibt ):
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
Wie Sie beide sehen können typeof
und instanceof
nicht ausreichen, um zu testen, ob ein Wert ein Boolescher Wert, eine Zahl oder eine Zeichenfolge ist, typeof
funktioniert dies nur für primitive Boolesche Werte, Zahlen und Zeichenfolgen. und instanceof
funktioniert nicht für primitive Boolesche Werte, Zahlen und Zeichenfolgen.
Glücklicherweise gibt es eine einfache Lösung für dieses Problem. Die Standardimplementierung von toString
(dh wie sie nativ definiert ist Object.prototype.toString
) gibt die interne [[Class]]
Eigenschaft von primitiven Werten und Objekten zurück:
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]
Die interne [[Class]]
Eigenschaft eines Werts ist viel nützlicher als typeof
der Wert. Wir können verwenden Object.prototype.toString
, um unsere eigene (nützlichere) Version des typeof
Operators wie folgt zu erstellen :
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
Hoffe dieser Artikel hat geholfen. Um mehr über die Unterschiede zwischen Grundelementen und umschlossenen Objekten zu erfahren, lesen Sie den folgenden Blog-Beitrag: Das geheime Leben von JavaScript-Grundelementen