A proper and semantic typeof function that works with literal primitives, boxed objects and those from another execution context.
Kindof.js provides a single
kindof function that does what you'd expect from
typeof — gives you the proper semantic type regardless if the variable was a primitive literal (
"Hello"), a boxed object (
new String("Hello")) or came from another execution context (e.g. an array from another
When and why should you use
- When you need a type check that returns
nullis an object.
- When you want to handle both literal primitives
new Number(42)(for robustness) the same way.
kindof(num) == "number"check makes that easy.
Be sure to compare with
==to allow for coercion in that case.
- When there's a chance you might get an object from another execution context.
In the browser that might mean an object from another
Different execution contexts have different built-in class instances, so you can't do
obj instanceof Datesafely.
Kindof.js supports all ECMAScript built-in types and classes:
Function and plain old
Object. Others, e.g.
JSON, are considered just objects. In general, objects that behave like value objects (numbers, dates etc.) or proper arrays have a kind other than
Please see the table below for the full list of kinds.
Note: Kindof.js follows semantic versioning.
kindof.js file and source it at will.
npm install kindof.
And require with
var kindof = require("kindof").
Pass any object to
kindof and compare its output to what you expect:
kindof"Hello" // => "string"kindof"Hello" // => "string"
A switch statement might help:
switch kindofobjcase "null": thisname = "Alfred"; breakcase "string": thisname = obj; breakcase "number": thisage = obj; breakdefault: throw "Pardon, sir, came upon an unexpected type."
The pattern is simple — all built-in objects that behave like value objects (numbers, strings, dates etc.) or are real arrays are said to be of a kind other than
arguments object, however, is not a proper array, so it therefore is an
Subclassed objects, such as subclassed arrays, are considered to be
object unless their internal
[[Class]] property remains that of the original. For ways to subclass properly, please see further reading below.
typeofoperator in ECMAScript 5.1.
typeofoperator as implemented by Firefox.
- Article on subclassing
Arrayby Juriy Zaytsev.
Kindof.js is released under a Lesser GNU Affero General Public License, which in summary means:
- You can use this program for no cost.
- You can use this program for both personal and commercial reasons.
- You do not have to share your own program's code which uses this program.
- You have to share modifications (e.g bug-fixes) you've made to this program.
For more convoluted language, see the