typeof
De typeof
-operator geeft een string terug die het type van de ongeëvalueerde operand weergeeft.
Syntaxis
De typeof
-operator wordt gevolgd door zijn operand:
typeof operand
Parameters
operand
is een uitdrukking die het object of de primitief voorstelt waarvan het type moet worden teruggegeven.
Beschrijving
De volgende tabel bevat de mogelijke waarden die typeof
kan teruggeven. Voor meer informatie over types of primitieven, zie pagina datastructuren in Javascript (en-US).
Type | Resultaat |
---|---|
Undefined | "undefined" |
Null | "object" (see below) |
Boolean | "boolean" |
Number | "number" |
String | "string" |
Symbol (nieuw in ECMAScript 2015) | "symbol" |
Host object (voorzien door de JS omgeving) | Implementatie-afhankelijk |
Function object (implementeert [[Call]] in termen van ECMA-262) | "function" |
Elk ander object | "object" |
Voorbeelden
// Nummers
typeof 37 === 'number';
typeof 3.14 === 'number';
typeof(42) === 'number';
typeof Math.LN2 === 'number';
typeof Infinity === 'number';
typeof NaN === 'number'; // Ondanks dat het "Not-A-Number" is
typeof Number(1) === 'number'; // maar gebruik deze manier nooit!
// Strings
typeof "" === 'string';
typeof "bla" === 'string';
typeof (typeof 1) === 'string'; // typeof geeft altijd een string terug
typeof String("abc") === 'string'; // maar gebruik deze manier nooit!
// Booleans
typeof true === 'boolean';
typeof false === 'boolean';
typeof Boolean(true) === 'boolean'; // maar gebruik deze manier nooit!
// Symbolen
typeof Symbol() === 'symbol'
typeof Symbol('foo') === 'symbol'
typeof Symbol.iterator === 'symbol'
// Ongedefinieerd
typeof undefined === 'undefined';
typeof declaredButUndefinedVariable === 'undefined';
typeof undeclaredVariable === 'undefined';
// Objecten
typeof {a:1} === 'object';
// gebruik Array.isArray of Object.prototype.toString.call
// om het verschil aan te geven tussen normale objecten en
// arrays (rijen).
typeof [1, 2, 4] === 'object';
typeof new Date() === 'object';
// Het volgende is verwarrend. Niet gebruiken!
typeof new Boolean(true) === 'object';
typeof new Number(1) === 'object';
typeof new String("abc") === 'object';
// Functies
typeof function(){} === 'function';
typeof class C {} === 'function';
typeof Math.sin === 'function';
null
// Dit geldt sinds het ontstaan van JavaScript
typeof null === 'object';
In de oorspronkelijke implementatie van JavaScript werden JavaScript-waarden gerepresenteerd met een type-label en een waarde. Het type-label voor de meeste objecten was 0. null
werd voorgesteld als de NULL-pointer (0x00 in de meeste platformen). Daarom had null het type-label 0, wat de foute typeof
teruggeefwaarde verklaart. (referentie)
Een oplossing (via een opt-in) werd voorgesteld voor ECMAScript, maar die werd afgekeurd. Anders zou het er als volgt hebben uitgezien: typeof null === 'null'
.
De new
-operator gebruiken
// Alle constructorfuncties die worden geïnstantieerd met het
// 'new'-sleutelwoord, zullen altijd typeof 'object' zijn.
var str = new String('String');
var num = new Number(100);
typeof str; // Geeft 'object' terug
typeof num; // Geeft 'object' terug
// Maar er is een uitzondering in het geval van de functieconstructor van JavaScript.
var func = new Function();
typeof func; // Geeft 'function' terug
Reguliere uitdrukkingen
Aanroepbare reguliere uitdrukkingen waren een niet-standaard toevoeging in sommige browsers.
typeof /s/ === 'function'; // Chrome 1-12 Niet comform aan ECMAScript 5.1
typeof /s/ === 'object'; // Firefox 5+ Conform aan ECMAScript 5.1
Temporal Dead Zone-fouten
Voor ECMAScript 2015 gaf typeof
altijd gegarandeerd een string terug voor elke operand waarmee het was voorzien. Maar met de toevoeging van niet-gehoiste, blokgekaderde let (en-US)
en const (en-US)
ontstaat er een ReferenceError (en-US)
als typeof
op let
- en const
-variabelen wordt gebruikt voordat ze zijn benoemd. Dit staat in contrast met onbenoemde variabelen, waarvoor typeof
'undefined' teruggeeft. Blokgekaderde variabelen zijn in een "temporal dead zone (en-US)" vanaf het begin van het blok totdat de intialisatie is verwerkt, waarin een fout ontstaat als ze worden benaderd.
typeof onbenoemdeVariabele === 'undefined';
typeof nieuweLetVariabele; let nieuweLetVariabele; // ReferenceError
typeof nieuweConstVariabele; const nieuweConstVariabele = 'hallo'; // ReferenceError
Uitzonderingen
Alle huidige browsers onthullen een niet-standaard hostobject document.all
(en-US) met type undefined
.
typeof document.all === 'undefined';
Hoewel de specificatie aangepaste type-labels toestaat voor niet-standaard exotische objecten, vereist het dat die type-labels verschillen van de ingebouwde. Dat document.all
een type-label undefined
heeft moet worden geclassificeerd als een uitzonderlijke overtreding van de regels.
Specificaties
Specificatie | Status | Opmerking |
---|---|---|
ECMAScript (ECMA-262) The definition of 'The typeof Operator' in that specification. |
Living Standard | |
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'The typeof Operator' in that specification. |
Standard | |
ECMAScript 5.1 (ECMA-262) The definition of 'The typeof Operator' in that specification. |
Standard | |
ECMAScript 3rd Edition (ECMA-262) The definition of 'The typeof Operator' in that specification. |
Standard | |
ECMAScript 1st Edition (ECMA-262) The definition of 'The typeof Operator' in that specification. |
Standard | Oorspronkelijke definitie. Geïmplementeerd in JavaScript 1.1. |
Browsercompatibiliteit
BCD tables only load in the browser
IE-specifieke opmerkingen
In IE 6, 7, en 8 zijn een groot aantal host objecten objecten en geen functions. bijvoorbeeld:
typeof alert === 'object'