.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / has-values / node_modules / kind-of / README.md
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)
2
3 > Get the native type of a value.
4
5 ## Install
6
7 Install with [npm](https://www.npmjs.com/):
8
9 ```sh
10 $ npm install --save kind-of
11 ```
12
13 Install with [bower](https://bower.io/)
14
15 ```sh
16 $ bower install kind-of --save
17 ```
18
19 ## Usage
20
21 > es5, browser and es6 ready
22
23 ```js
24 var kindOf = require('kind-of');
25
26 kindOf(undefined);
27 //=> 'undefined'
28
29 kindOf(null);
30 //=> 'null'
31
32 kindOf(true);
33 //=> 'boolean'
34
35 kindOf(false);
36 //=> 'boolean'
37
38 kindOf(new Boolean(true));
39 //=> 'boolean'
40
41 kindOf(new Buffer(''));
42 //=> 'buffer'
43
44 kindOf(42);
45 //=> 'number'
46
47 kindOf(new Number(42));
48 //=> 'number'
49
50 kindOf('str');
51 //=> 'string'
52
53 kindOf(new String('str'));
54 //=> 'string'
55
56 kindOf(arguments);
57 //=> 'arguments'
58
59 kindOf({});
60 //=> 'object'
61
62 kindOf(Object.create(null));
63 //=> 'object'
64
65 kindOf(new Test());
66 //=> 'object'
67
68 kindOf(new Date());
69 //=> 'date'
70
71 kindOf([]);
72 //=> 'array'
73
74 kindOf([1, 2, 3]);
75 //=> 'array'
76
77 kindOf(new Array());
78 //=> 'array'
79
80 kindOf(/foo/);
81 //=> 'regexp'
82
83 kindOf(new RegExp('foo'));
84 //=> 'regexp'
85
86 kindOf(function () {});
87 //=> 'function'
88
89 kindOf(function * () {});
90 //=> 'function'
91
92 kindOf(new Function());
93 //=> 'function'
94
95 kindOf(new Map());
96 //=> 'map'
97
98 kindOf(new WeakMap());
99 //=> 'weakmap'
100
101 kindOf(new Set());
102 //=> 'set'
103
104 kindOf(new WeakSet());
105 //=> 'weakset'
106
107 kindOf(Symbol('str'));
108 //=> 'symbol'
109
110 kindOf(new Int8Array());
111 //=> 'int8array'
112
113 kindOf(new Uint8Array());
114 //=> 'uint8array'
115
116 kindOf(new Uint8ClampedArray());
117 //=> 'uint8clampedarray'
118
119 kindOf(new Int16Array());
120 //=> 'int16array'
121
122 kindOf(new Uint16Array());
123 //=> 'uint16array'
124
125 kindOf(new Int32Array());
126 //=> 'int32array'
127
128 kindOf(new Uint32Array());
129 //=> 'uint32array'
130
131 kindOf(new Float32Array());
132 //=> 'float32array'
133
134 kindOf(new Float64Array());
135 //=> 'float64array'
136 ```
137
138 ## Benchmarks
139
140 Benchmarked against [typeof](http://github.com/CodingFu/typeof) and [type-of](https://github.com/ForbesLindesay/type-of).
141 Note that performaces is slower for es6 features `Map`, `WeakMap`, `Set` and `WeakSet`.
142
143 ```bash
144 #1: array
145   current x 23,329,397 ops/sec ±0.82% (94 runs sampled)
146   lib-type-of x 4,170,273 ops/sec ±0.55% (94 runs sampled)
147   lib-typeof x 9,686,935 ops/sec ±0.59% (98 runs sampled)
148
149 #2: boolean
150   current x 27,197,115 ops/sec ±0.85% (94 runs sampled)
151   lib-type-of x 3,145,791 ops/sec ±0.73% (97 runs sampled)
152   lib-typeof x 9,199,562 ops/sec ±0.44% (99 runs sampled)
153
154 #3: date
155   current x 20,190,117 ops/sec ±0.86% (92 runs sampled)
156   lib-type-of x 5,166,970 ops/sec ±0.74% (94 runs sampled)
157   lib-typeof x 9,610,821 ops/sec ±0.50% (96 runs sampled)
158
159 #4: function
160   current x 23,855,460 ops/sec ±0.60% (97 runs sampled)
161   lib-type-of x 5,667,740 ops/sec ±0.54% (100 runs sampled)
162   lib-typeof x 10,010,644 ops/sec ±0.44% (100 runs sampled)
163
164 #5: null
165   current x 27,061,047 ops/sec ±0.97% (96 runs sampled)
166   lib-type-of x 13,965,573 ops/sec ±0.62% (97 runs sampled)
167   lib-typeof x 8,460,194 ops/sec ±0.61% (97 runs sampled)
168
169 #6: number
170   current x 25,075,682 ops/sec ±0.53% (99 runs sampled)
171   lib-type-of x 2,266,405 ops/sec ±0.41% (98 runs sampled)
172   lib-typeof x 9,821,481 ops/sec ±0.45% (99 runs sampled)
173
174 #7: object
175   current x 3,348,980 ops/sec ±0.49% (99 runs sampled)
176   lib-type-of x 3,245,138 ops/sec ±0.60% (94 runs sampled)
177   lib-typeof x 9,262,952 ops/sec ±0.59% (99 runs sampled)
178
179 #8: regex
180   current x 21,284,827 ops/sec ±0.72% (96 runs sampled)
181   lib-type-of x 4,689,241 ops/sec ±0.43% (100 runs sampled)
182   lib-typeof x 8,957,593 ops/sec ±0.62% (98 runs sampled)
183
184 #9: string
185   current x 25,379,234 ops/sec ±0.58% (96 runs sampled)
186   lib-type-of x 3,635,148 ops/sec ±0.76% (93 runs sampled)
187   lib-typeof x 9,494,134 ops/sec ±0.49% (98 runs sampled)
188
189 #10: undef
190   current x 27,459,221 ops/sec ±1.01% (93 runs sampled)
191   lib-type-of x 14,360,433 ops/sec ±0.52% (99 runs sampled)
192   lib-typeof x 23,202,868 ops/sec ±0.59% (94 runs sampled)
193
194 ```
195
196 ## Release history
197
198 ### v4.0.0
199
200 **Added**
201
202 * `promise` support
203
204 ## Optimizations
205
206 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:
207
208 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.
209 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.
210 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'`
211
212 ## About
213
214 ### Related projects
215
216 * [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")
217 * [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.")
218 * [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. ")
219
220 ### Contributing
221
222 Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
223
224 ### Contributors
225
226 | **Commits** | **Contributor** | 
227 | --- | --- |
228 | 64 | [jonschlinkert](https://github.com/jonschlinkert) |
229 | 2 | [miguelmota](https://github.com/miguelmota) |
230 | 1 | [dtothefp](https://github.com/dtothefp) |
231 | 1 | [ksheedlo](https://github.com/ksheedlo) |
232 | 1 | [pdehaan](https://github.com/pdehaan) |
233 | 1 | [laggingreflex](https://github.com/laggingreflex) |
234
235 ### Building docs
236
237 _(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
238
239 To generate the readme, run the following command:
240
241 ```sh
242 $ npm install -g verbose/verb#dev verb-generate-readme && verb
243 ```
244
245 ### Running tests
246
247 Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
248
249 ```sh
250 $ npm install && npm test
251 ```
252
253 ### Author
254
255 **Jon Schlinkert**
256
257 * [github/jonschlinkert](https://github.com/jonschlinkert)
258 * [twitter/jonschlinkert](https://twitter.com/jonschlinkert)
259
260 ### License
261
262 Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert).
263 Released under the [MIT License](LICENSE).
264
265 ***
266
267 _This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on May 19, 2017._