# type-detect

Improved typeof detection for node and the browser.

Supported Browsers
Chrome | Edge | Firefox | Safari | IE
--- | --- | --- | --- | ---
✅ | ✅ | ✅ | ✅ | 9, 10, 11

## What is Type-Detect? Type Detect is a module which you can use to detect the type of a given object. It returns a string representation of the object's type, either using [`typeof`](http://www.ecma-international.org/ecma-262/6.0/index.html#sec-typeof-operator) or [`@@toStringTag`](http://www.ecma-international.org/ecma-262/6.0/index.html#sec-symbol.tostringtag). It also normalizes some object names for consistency among browsers. ## Why? The `typeof` operator will only specify primitive values; everything else is `"object"` (including `null`, arrays, regexps, etc). Many developers use `Object.prototype.toString()` - which is a fine alternative and returns many more types (null returns `[object Null]`, Arrays as `[object Array]`, regexps as `[object RegExp]` etc). Sadly, `Object.prototype.toString` is slow, and buggy. By slow - we mean it is slower than `typeof`. By buggy - we mean that some values (like Promises, the global object, iterators, dataviews, a bunch of HTML elements) all report different things in different browsers. `type-detect` fixes all of the shortcomings with `Object.prototype.toString`. We have extra code to speed up checks of JS and DOM objects, as much as 20-30x faster for some values. `type-detect` also fixes any consistencies with these objects. ## Installation ### Node.js `type-detect` is available on [npm](http://npmjs.org). To install it, type: $ npm install type-detect ### Browsers You can also use it within the browser; install via npm and use the `type-detect.js` file found within the download. For example: ```html
``` ## Usage The primary export of `type-detect` is function that can serve as a replacement for `typeof`. The results of this function will be more specific than that of native `typeof`. ```js var type = require('type-detect'); ``` #### array ```js assert(type([]) === 'Array'); assert(type(new Array()) === 'Array'); ``` #### regexp ```js assert(type(/a-z/gi) === 'RegExp'); assert(type(new RegExp('a-z')) === 'RegExp'); ``` #### function ```js assert(type(function () {}) === 'function'); ``` #### arguments ```js (function () { assert(type(arguments) === 'Arguments'); })(); ``` #### date ```js assert(type(new Date) === 'Date'); ``` #### number ```js assert(type(1) === 'number'); assert(type(1.234) === 'number'); assert(type(-1) === 'number'); assert(type(-1.234) === 'number'); assert(type(Infinity) === 'number'); assert(type(NaN) === 'number'); assert(type(new Number(1)) === 'Number'); // note - the object version has a capital N ``` #### string ```js assert(type('hello world') === 'string'); assert(type(new String('hello')) === 'String'); // note - the object version has a capital S ``` #### null ```js assert(type(null) === 'null'); assert(type(undefined) !== 'null'); ``` #### undefined ```js assert(type(undefined) === 'undefined'); assert(type(null) !== 'undefined'); ``` #### object ```js var Noop = function () {}; assert(type({}) === 'Object'); assert(type(Noop) !== 'Object'); assert(type(new Noop) === 'Object'); assert(type(new Object) === 'Object'); ``` #### ECMA6 Types All new ECMAScript 2015 objects are also supported, such as Promises and Symbols: ```js assert(type(new Map() === 'Map'); assert(type(new WeakMap()) === 'WeakMap'); assert(type(new Set()) === 'Set'); assert(type(new WeakSet()) === 'WeakSet'); assert(type(Symbol()) === 'symbol'); assert(type(new Promise(callback) === 'Promise'); assert(type(new Int8Array()) === 'Int8Array'); assert(type(new Uint8Array()) === 'Uint8Array'); assert(type(new UInt8ClampedArray()) === 'Uint8ClampedArray'); assert(type(new Int16Array()) === 'Int16Array'); assert(type(new Uint16Array()) === 'Uint16Array'); assert(type(new Int32Array()) === 'Int32Array'); assert(type(new UInt32Array()) === 'Uint32Array'); assert(type(new Float32Array()) === 'Float32Array'); assert(type(new Float64Array()) === 'Float64Array'); assert(type(new ArrayBuffer()) === 'ArrayBuffer'); assert(type(new DataView(arrayBuffer)) === 'DataView'); ``` Also, if you use `Symbol.toStringTag` to change an Objects return value of the `toString()` Method, `type()` will return this value, e.g: ```js var myObject = {}; myObject[Symbol.toStringTag] = 'myCustomType'; assert(type(myObject) === 'myCustomType'); ```