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 nullalle als Objekte betrachtet ( nullist 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 undefinedsind nicht Objekte. Sie sind primitive Werte in JavaScript. Allerdings booleans, Zahlen und Strings auch Konstrukteure haben Boolean, Numberund Stringjeweils 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, Numberund StringKonstrukteuren bzw. werden sie Objekte. Der instanceofOperator arbeitet nur für Objekte (weshalb er falsefü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 typeofund instanceofnicht ausreichen, um zu testen, ob ein Wert ein Boolescher Wert, eine Zahl oder eine Zeichenfolge ist, typeoffunktioniert dies nur für primitive Boolesche Werte, Zahlen und Zeichenfolgen. und instanceoffunktioniert 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 typeofder Wert. Wir können verwenden Object.prototype.toString, um unsere eigene (nützlichere) Version des typeofOperators 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