1 # kind-of [![NPM version](https://img.shields.io/npm/v/kind-of.svg?style=flat)](https://www.npmjs.com/package/kind-of) [![NPM monthly downloads](https://img.shields.io/npm/dm/kind-of.svg?style=flat)](https://npmjs.org/package/kind-of) [![NPM total downloads](https://img.shields.io/npm/dt/kind-of.svg?style=flat)](https://npmjs.org/package/kind-of) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/kind-of.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/kind-of)
3 > Get the native type of a value.
7 Install with [npm](https://www.npmjs.com/):
10 $ npm install --save kind-of
15 Install with [bower](http://bower.io/)
18 $ bower install kind-of --save
23 > es5, browser and es6 ready
26 var kindOf = require('kind-of');
40 kindOf(new Boolean(true));
43 kindOf(new Buffer(''));
49 kindOf(new Number(42));
55 kindOf(new String('str'));
64 kindOf(Object.create(null));
85 kindOf(new RegExp('foo'));
88 kindOf(function () {});
91 kindOf(function * () {});
94 kindOf(new Function());
100 kindOf(new WeakMap());
106 kindOf(new WeakSet());
109 kindOf(Symbol('str'));
112 kindOf(new Int8Array());
115 kindOf(new Uint8Array());
118 kindOf(new Uint8ClampedArray());
119 //=> 'uint8clampedarray'
121 kindOf(new Int16Array());
124 kindOf(new Uint16Array());
127 kindOf(new Int32Array());
130 kindOf(new Uint32Array());
133 kindOf(new Float32Array());
136 kindOf(new Float64Array());
142 Benchmarked against [typeof](http://github.com/CodingFu/typeof) and [type-of](https://github.com/ForbesLindesay/type-of).
143 Note that performaces is slower for es6 features `Map`, `WeakMap`, `Set` and `WeakSet`.
147 current x 23,329,397 ops/sec ±0.82% (94 runs sampled)
148 lib-type-of x 4,170,273 ops/sec ±0.55% (94 runs sampled)
149 lib-typeof x 9,686,935 ops/sec ±0.59% (98 runs sampled)
152 current x 27,197,115 ops/sec ±0.85% (94 runs sampled)
153 lib-type-of x 3,145,791 ops/sec ±0.73% (97 runs sampled)
154 lib-typeof x 9,199,562 ops/sec ±0.44% (99 runs sampled)
157 current x 20,190,117 ops/sec ±0.86% (92 runs sampled)
158 lib-type-of x 5,166,970 ops/sec ±0.74% (94 runs sampled)
159 lib-typeof x 9,610,821 ops/sec ±0.50% (96 runs sampled)
162 current x 23,855,460 ops/sec ±0.60% (97 runs sampled)
163 lib-type-of x 5,667,740 ops/sec ±0.54% (100 runs sampled)
164 lib-typeof x 10,010,644 ops/sec ±0.44% (100 runs sampled)
167 current x 27,061,047 ops/sec ±0.97% (96 runs sampled)
168 lib-type-of x 13,965,573 ops/sec ±0.62% (97 runs sampled)
169 lib-typeof x 8,460,194 ops/sec ±0.61% (97 runs sampled)
172 current x 25,075,682 ops/sec ±0.53% (99 runs sampled)
173 lib-type-of x 2,266,405 ops/sec ±0.41% (98 runs sampled)
174 lib-typeof x 9,821,481 ops/sec ±0.45% (99 runs sampled)
177 current x 3,348,980 ops/sec ±0.49% (99 runs sampled)
178 lib-type-of x 3,245,138 ops/sec ±0.60% (94 runs sampled)
179 lib-typeof x 9,262,952 ops/sec ±0.59% (99 runs sampled)
182 current x 21,284,827 ops/sec ±0.72% (96 runs sampled)
183 lib-type-of x 4,689,241 ops/sec ±0.43% (100 runs sampled)
184 lib-typeof x 8,957,593 ops/sec ±0.62% (98 runs sampled)
187 current x 25,379,234 ops/sec ±0.58% (96 runs sampled)
188 lib-type-of x 3,635,148 ops/sec ±0.76% (93 runs sampled)
189 lib-typeof x 9,494,134 ops/sec ±0.49% (98 runs sampled)
192 current x 27,459,221 ops/sec ±1.01% (93 runs sampled)
193 lib-type-of x 14,360,433 ops/sec ±0.52% (99 runs sampled)
194 lib-typeof x 23,202,868 ops/sec ±0.59% (94 runs sampled)
199 In 7 out of 8 cases, this library is 2x-10x faster than other top libraries included in the benchmarks. There are a few things that lead to this performance advantage, none of them hard and fast rules, but all of them simple and repeatable in almost any code library:
201 1. Optimize around the fastest and most common use cases first. Of course, this will change from project-to-project, but I took some time to understand how and why `typeof` checks were being used in my own libraries and other libraries I use a lot.
202 2. Optimize around bottlenecks - In other words, the order in which conditionals are implemented is significant, because each check is only as fast as the failing checks that came before it. Here, the biggest bottleneck by far is checking for plain objects (an object that was created by the `Object` constructor). I opted to make this check happen by process of elimination rather than brute force up front (e.g. by using something like `val.constructor.name`), so that every other type check would not be penalized it.
203 3. Don't do uneccessary processing - why do `.slice(8, -1).toLowerCase();` just to get the word `regex`? It's much faster to do `if (type === '[object RegExp]') return 'regex'`
209 * [is-glob](https://www.npmjs.com/package/is-glob): Returns `true` if the given string looks like a glob pattern or an extglob pattern… [more](https://github.com/jonschlinkert/is-glob) | [homepage](https://github.com/jonschlinkert/is-glob "Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a bet")
210 * [is-number](https://www.npmjs.com/package/is-number): Returns true if the value is a number. comprehensive tests. | [homepage](https://github.com/jonschlinkert/is-number "Returns true if the value is a number. comprehensive tests.")
211 * [is-primitive](https://www.npmjs.com/package/is-primitive): Returns `true` if the value is a primitive. | [homepage](https://github.com/jonschlinkert/is-primitive "Returns `true` if the value is a primitive. ")
215 Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
219 | **Commits** | **Contributor**<br/> |
221 | 49 | [jonschlinkert](https://github.com/jonschlinkert) |
222 | 2 | [miguelmota](https://github.com/miguelmota) |
223 | 1 | [dtothefp](https://github.com/dtothefp) |
224 | 1 | [pdehaan](https://github.com/pdehaan) |
228 _(This document was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme) (a [verb](https://github.com/verbose/verb) generator), please don't edit the readme directly. Any changes to the readme must be made in [.verb.md](.verb.md).)_
230 To generate the readme and API documentation with [verb](https://github.com/verbose/verb):
233 $ npm install -g verb verb-generate-readme && verb
238 Install dev dependencies:
241 $ npm install -d && npm test
248 * [github/jonschlinkert](https://github.com/jonschlinkert)
249 * [twitter/jonschlinkert](http://twitter.com/jonschlinkert)
253 Copyright © 2016, [Jon Schlinkert](https://github.com/jonschlinkert).
254 Released under the [MIT license](https://github.com/jonschlinkert/kind-of/blob/master/LICENSE).
258 _This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.2.0, on December 07, 2016._