The `typeof` Operator in JavaScript
The typeof
operator returns the type of a given variable
as a string.
typeof 42; // 'number'
typeof 'test'; // 'string'
typeof true; // 'boolean'
typeof (void 0); // 'undefined'
typeof BigInt('1234'); // 'bigint'
typeof Symbol('foo'); // 'symbol'
typeof ({ answer: 42 }); // 'object'
typeof function() {}; // 'function'
// As far as `typeof` is concerned, all objects are the same.
class MyClass {}
typeof (new MyClass()); // 'object'
Here's the general idea: the typeof
operator returns which of the 8 JavaScript data types a given value is. There's one key exception to this
rule: null
.
With null
The one big gotcha with typeof
is that typeof null === 'object'
.
There is a historical reason for this behavior, and a proposal to change this behavior was rejected, so it looks like JavaScript is stuck
with this quirk.
The workaround to check whether a value is actually an object with
typeof
is to check whether the type is 'object'
and the value
is not strictly equal to null
.
function isObject(v) {
return typeof v === 'object' && v !== null;
}
Error Cases
The typeof
operator can throw an error if you use it on
a block scope variable before you define it.
// Throws 'ReferenceError: v is not defined'
console.log(typeof v);
let v;
This behavior only applies for block scoped variables. For example,
if you don't define v
at all, the above script will work fine.
console.log(typeof v); // 'undefined'
//let v;
Block scoped variables are the only case where typeof
throws an
error. Otherwise, typeof
will always succeed.