root / HServer / 00.Server / 00.Program / node_modules / is / index.js
이력 | 보기 | 이력해설 | 다운로드 (14.8 KB)
1 |
|
---|---|
2 |
/**!
|
3 |
* is
|
4 |
* the definitive JavaScript type testing library
|
5 |
*
|
6 |
* @copyright 2013 Enrico Marino
|
7 |
* @license MIT
|
8 |
*/
|
9 |
|
10 |
var objProto = Object.prototype;
|
11 |
var owns = objProto.hasOwnProperty;
|
12 |
var toString = objProto.toString;
|
13 |
var isActualNaN = function (value) { |
14 |
return value !== value;
|
15 |
}; |
16 |
var NON_HOST_TYPES = {
|
17 |
"boolean": 1, |
18 |
"number": 1, |
19 |
"string": 1, |
20 |
"undefined": 1 |
21 |
}; |
22 |
|
23 |
/**
|
24 |
* Expose `is`
|
25 |
*/
|
26 |
|
27 |
var is = module.exports = {};
|
28 |
|
29 |
/**
|
30 |
* Test general.
|
31 |
*/
|
32 |
|
33 |
/**
|
34 |
* is.type
|
35 |
* Test if `value` is a type of `type`.
|
36 |
*
|
37 |
* @param {Mixed} value value to test
|
38 |
* @param {String} type type
|
39 |
* @return {Boolean} true if `value` is a type of `type`, false otherwise
|
40 |
* @api public
|
41 |
*/
|
42 |
|
43 |
is.a = |
44 |
is.type = function (value, type) { |
45 |
return typeof value === type; |
46 |
}; |
47 |
|
48 |
/**
|
49 |
* is.defined
|
50 |
* Test if `value` is defined.
|
51 |
*
|
52 |
* @param {Mixed} value value to test
|
53 |
* @return {Boolean} true if 'value' is defined, false otherwise
|
54 |
* @api public
|
55 |
*/
|
56 |
|
57 |
is.defined = function (value) { |
58 |
return value !== undefined; |
59 |
}; |
60 |
|
61 |
/**
|
62 |
* is.empty
|
63 |
* Test if `value` is empty.
|
64 |
*
|
65 |
* @param {Mixed} value value to test
|
66 |
* @return {Boolean} true if `value` is empty, false otherwise
|
67 |
* @api public
|
68 |
*/
|
69 |
|
70 |
is.empty = function (value) { |
71 |
var type = toString.call(value);
|
72 |
var key;
|
73 |
|
74 |
if ('[object Array]' === type || '[object Arguments]' === type) { |
75 |
return value.length === 0; |
76 |
} |
77 |
|
78 |
if ('[object Object]' === type) { |
79 |
for (key in value) if (owns.call(value, key)) return false; |
80 |
return true; |
81 |
} |
82 |
|
83 |
if ('[object String]' === type) { |
84 |
return '' === value; |
85 |
} |
86 |
|
87 |
return false; |
88 |
}; |
89 |
|
90 |
/**
|
91 |
* is.equal
|
92 |
* Test if `value` is equal to `other`.
|
93 |
*
|
94 |
* @param {Mixed} value value to test
|
95 |
* @param {Mixed} other value to compare with
|
96 |
* @return {Boolean} true if `value` is equal to `other`, false otherwise
|
97 |
*/
|
98 |
|
99 |
is.equal = function (value, other) { |
100 |
var type = toString.call(value)
|
101 |
var key;
|
102 |
|
103 |
if (type !== toString.call(other)) {
|
104 |
return false; |
105 |
} |
106 |
|
107 |
if ('[object Object]' === type) { |
108 |
for (key in value) { |
109 |
if (!is.equal(value[key], other[key])) {
|
110 |
return false; |
111 |
} |
112 |
} |
113 |
return true; |
114 |
} |
115 |
|
116 |
if ('[object Array]' === type) { |
117 |
key = value.length; |
118 |
if (key !== other.length) {
|
119 |
return false; |
120 |
} |
121 |
while (--key) {
|
122 |
if (!is.equal(value[key], other[key])) {
|
123 |
return false; |
124 |
} |
125 |
} |
126 |
return true; |
127 |
} |
128 |
|
129 |
if ('[object Function]' === type) { |
130 |
return value.prototype === other.prototype;
|
131 |
} |
132 |
|
133 |
if ('[object Date]' === type) { |
134 |
return value.getTime() === other.getTime();
|
135 |
} |
136 |
|
137 |
return value === other;
|
138 |
}; |
139 |
|
140 |
/**
|
141 |
* is.hosted
|
142 |
* Test if `value` is hosted by `host`.
|
143 |
*
|
144 |
* @param {Mixed} value to test
|
145 |
* @param {Mixed} host host to test with
|
146 |
* @return {Boolean} true if `value` is hosted by `host`, false otherwise
|
147 |
* @api public
|
148 |
*/
|
149 |
|
150 |
is.hosted = function (value, host) { |
151 |
var type = typeof host[value]; |
152 |
return type === 'object' ? !!host[value] : !NON_HOST_TYPES[type]; |
153 |
}; |
154 |
|
155 |
/**
|
156 |
* is.instance
|
157 |
* Test if `value` is an instance of `constructor`.
|
158 |
*
|
159 |
* @param {Mixed} value value to test
|
160 |
* @return {Boolean} true if `value` is an instance of `constructor`
|
161 |
* @api public
|
162 |
*/
|
163 |
|
164 |
is.instance = is['instanceof'] = function (value, constructor) { |
165 |
return value instanceof constructor; |
166 |
}; |
167 |
|
168 |
/**
|
169 |
* is.null
|
170 |
* Test if `value` is null.
|
171 |
*
|
172 |
* @param {Mixed} value value to test
|
173 |
* @return {Boolean} true if `value` is null, false otherwise
|
174 |
* @api public
|
175 |
*/
|
176 |
|
177 |
is['null'] = function (value) { |
178 |
return value === null; |
179 |
}; |
180 |
|
181 |
/**
|
182 |
* is.undefined
|
183 |
* Test if `value` is undefined.
|
184 |
*
|
185 |
* @param {Mixed} value value to test
|
186 |
* @return {Boolean} true if `value` is undefined, false otherwise
|
187 |
* @api public
|
188 |
*/
|
189 |
|
190 |
is.undefined = function (value) { |
191 |
return value === undefined; |
192 |
}; |
193 |
|
194 |
/**
|
195 |
* Test arguments.
|
196 |
*/
|
197 |
|
198 |
/**
|
199 |
* is.arguments
|
200 |
* Test if `value` is an arguments object.
|
201 |
*
|
202 |
* @param {Mixed} value value to test
|
203 |
* @return {Boolean} true if `value` is an arguments object, false otherwise
|
204 |
* @api public
|
205 |
*/
|
206 |
|
207 |
is.arguments = function (value) { |
208 |
var isStandardArguments = '[object Arguments]' === toString.call(value); |
209 |
var isOldArguments = !is.array(value) && is.arraylike(value) && is.object(value) && is.fn(value.callee);
|
210 |
return isStandardArguments || isOldArguments;
|
211 |
}; |
212 |
|
213 |
/**
|
214 |
* Test array.
|
215 |
*/
|
216 |
|
217 |
/**
|
218 |
* is.array
|
219 |
* Test if 'value' is an array.
|
220 |
*
|
221 |
* @param {Mixed} value value to test
|
222 |
* @return {Boolean} true if `value` is an array, false otherwise
|
223 |
* @api public
|
224 |
*/
|
225 |
|
226 |
is.array = function (value) { |
227 |
return '[object Array]' === toString.call(value); |
228 |
}; |
229 |
|
230 |
/**
|
231 |
* is.arguments.empty
|
232 |
* Test if `value` is an empty arguments object.
|
233 |
*
|
234 |
* @param {Mixed} value value to test
|
235 |
* @return {Boolean} true if `value` is an empty arguments object, false otherwise
|
236 |
* @api public
|
237 |
*/
|
238 |
is.arguments.empty = function (value) { |
239 |
return is.arguments(value) && value.length === 0; |
240 |
}; |
241 |
|
242 |
/**
|
243 |
* is.array.empty
|
244 |
* Test if `value` is an empty array.
|
245 |
*
|
246 |
* @param {Mixed} value value to test
|
247 |
* @return {Boolean} true if `value` is an empty array, false otherwise
|
248 |
* @api public
|
249 |
*/
|
250 |
is.array.empty = function (value) { |
251 |
return is.array(value) && value.length === 0; |
252 |
}; |
253 |
|
254 |
/**
|
255 |
* is.arraylike
|
256 |
* Test if `value` is an arraylike object.
|
257 |
*
|
258 |
* @param {Mixed} value value to test
|
259 |
* @return {Boolean} true if `value` is an arguments object, false otherwise
|
260 |
* @api public
|
261 |
*/
|
262 |
|
263 |
is.arraylike = function (value) { |
264 |
return !!value && !is.boolean(value) |
265 |
&& owns.call(value, 'length')
|
266 |
&& isFinite(value.length) |
267 |
&& is.number(value.length) |
268 |
&& value.length >= 0;
|
269 |
}; |
270 |
|
271 |
/**
|
272 |
* Test boolean.
|
273 |
*/
|
274 |
|
275 |
/**
|
276 |
* is.boolean
|
277 |
* Test if `value` is a boolean.
|
278 |
*
|
279 |
* @param {Mixed} value value to test
|
280 |
* @return {Boolean} true if `value` is a boolean, false otherwise
|
281 |
* @api public
|
282 |
*/
|
283 |
|
284 |
is.boolean = function (value) { |
285 |
return '[object Boolean]' === toString.call(value); |
286 |
}; |
287 |
|
288 |
/**
|
289 |
* is.false
|
290 |
* Test if `value` is false.
|
291 |
*
|
292 |
* @param {Mixed} value value to test
|
293 |
* @return {Boolean} true if `value` is false, false otherwise
|
294 |
* @api public
|
295 |
*/
|
296 |
|
297 |
is['false'] = function (value) { |
298 |
return is.boolean(value) && (value === false || value.valueOf() === false); |
299 |
}; |
300 |
|
301 |
/**
|
302 |
* is.true
|
303 |
* Test if `value` is true.
|
304 |
*
|
305 |
* @param {Mixed} value value to test
|
306 |
* @return {Boolean} true if `value` is true, false otherwise
|
307 |
* @api public
|
308 |
*/
|
309 |
|
310 |
is['true'] = function (value) { |
311 |
return is.boolean(value) && (value === true || value.valueOf() === true); |
312 |
}; |
313 |
|
314 |
/**
|
315 |
* Test date.
|
316 |
*/
|
317 |
|
318 |
/**
|
319 |
* is.date
|
320 |
* Test if `value` is a date.
|
321 |
*
|
322 |
* @param {Mixed} value value to test
|
323 |
* @return {Boolean} true if `value` is a date, false otherwise
|
324 |
* @api public
|
325 |
*/
|
326 |
|
327 |
is.date = function (value) { |
328 |
return '[object Date]' === toString.call(value); |
329 |
}; |
330 |
|
331 |
/**
|
332 |
* Test element.
|
333 |
*/
|
334 |
|
335 |
/**
|
336 |
* is.element
|
337 |
* Test if `value` is an html element.
|
338 |
*
|
339 |
* @param {Mixed} value value to test
|
340 |
* @return {Boolean} true if `value` is an HTML Element, false otherwise
|
341 |
* @api public
|
342 |
*/
|
343 |
|
344 |
is.element = function (value) { |
345 |
return value !== undefined |
346 |
&& typeof HTMLElement !== 'undefined' |
347 |
&& value instanceof HTMLElement
|
348 |
&& value.nodeType === 1;
|
349 |
}; |
350 |
|
351 |
/**
|
352 |
* Test error.
|
353 |
*/
|
354 |
|
355 |
/**
|
356 |
* is.error
|
357 |
* Test if `value` is an error object.
|
358 |
*
|
359 |
* @param {Mixed} value value to test
|
360 |
* @return {Boolean} true if `value` is an error object, false otherwise
|
361 |
* @api public
|
362 |
*/
|
363 |
|
364 |
is.error = function (value) { |
365 |
return '[object Error]' === toString.call(value); |
366 |
}; |
367 |
|
368 |
/**
|
369 |
* Test function.
|
370 |
*/
|
371 |
|
372 |
/**
|
373 |
* is.fn / is.function (deprecated)
|
374 |
* Test if `value` is a function.
|
375 |
*
|
376 |
* @param {Mixed} value value to test
|
377 |
* @return {Boolean} true if `value` is a function, false otherwise
|
378 |
* @api public
|
379 |
*/
|
380 |
|
381 |
is.fn = is['function'] = function (value) { |
382 |
var isAlert = typeof window !== 'undefined' && value === window.alert; |
383 |
return isAlert || '[object Function]' === toString.call(value); |
384 |
}; |
385 |
|
386 |
/**
|
387 |
* Test number.
|
388 |
*/
|
389 |
|
390 |
/**
|
391 |
* is.number
|
392 |
* Test if `value` is a number.
|
393 |
*
|
394 |
* @param {Mixed} value value to test
|
395 |
* @return {Boolean} true if `value` is a number, false otherwise
|
396 |
* @api public
|
397 |
*/
|
398 |
|
399 |
is.number = function (value) { |
400 |
return '[object Number]' === toString.call(value); |
401 |
}; |
402 |
|
403 |
/**
|
404 |
* is.infinite
|
405 |
* Test if `value` is positive or negative infinity.
|
406 |
*
|
407 |
* @param {Mixed} value value to test
|
408 |
* @return {Boolean} true if `value` is positive or negative Infinity, false otherwise
|
409 |
* @api public
|
410 |
*/
|
411 |
is.infinite = function (value) { |
412 |
return value === Infinity || value === -Infinity; |
413 |
}; |
414 |
|
415 |
/**
|
416 |
* is.decimal
|
417 |
* Test if `value` is a decimal number.
|
418 |
*
|
419 |
* @param {Mixed} value value to test
|
420 |
* @return {Boolean} true if `value` is a decimal number, false otherwise
|
421 |
* @api public
|
422 |
*/
|
423 |
|
424 |
is.decimal = function (value) { |
425 |
return is.number(value) && !isActualNaN(value) && !is.infinite(value) && value % 1 !== 0; |
426 |
}; |
427 |
|
428 |
/**
|
429 |
* is.divisibleBy
|
430 |
* Test if `value` is divisible by `n`.
|
431 |
*
|
432 |
* @param {Number} value value to test
|
433 |
* @param {Number} n dividend
|
434 |
* @return {Boolean} true if `value` is divisible by `n`, false otherwise
|
435 |
* @api public
|
436 |
*/
|
437 |
|
438 |
is.divisibleBy = function (value, n) { |
439 |
var isDividendInfinite = is.infinite(value);
|
440 |
var isDivisorInfinite = is.infinite(n);
|
441 |
var isNonZeroNumber = is.number(value) && !isActualNaN(value) && is.number(n) && !isActualNaN(n) && n !== 0; |
442 |
return isDividendInfinite || isDivisorInfinite || (isNonZeroNumber && value % n === 0); |
443 |
}; |
444 |
|
445 |
/**
|
446 |
* is.int
|
447 |
* Test if `value` is an integer.
|
448 |
*
|
449 |
* @param value to test
|
450 |
* @return {Boolean} true if `value` is an integer, false otherwise
|
451 |
* @api public
|
452 |
*/
|
453 |
|
454 |
is.int = function (value) { |
455 |
return is.number(value) && !isActualNaN(value) && value % 1 === 0; |
456 |
}; |
457 |
|
458 |
/**
|
459 |
* is.maximum
|
460 |
* Test if `value` is greater than 'others' values.
|
461 |
*
|
462 |
* @param {Number} value value to test
|
463 |
* @param {Array} others values to compare with
|
464 |
* @return {Boolean} true if `value` is greater than `others` values
|
465 |
* @api public
|
466 |
*/
|
467 |
|
468 |
is.maximum = function (value, others) { |
469 |
if (isActualNaN(value)) {
|
470 |
throw new TypeError('NaN is not a valid value'); |
471 |
} else if (!is.arraylike(others)) { |
472 |
throw new TypeError('second argument must be array-like'); |
473 |
} |
474 |
var len = others.length;
|
475 |
|
476 |
while (--len >= 0) { |
477 |
if (value < others[len]) {
|
478 |
return false; |
479 |
} |
480 |
} |
481 |
|
482 |
return true; |
483 |
}; |
484 |
|
485 |
/**
|
486 |
* is.minimum
|
487 |
* Test if `value` is less than `others` values.
|
488 |
*
|
489 |
* @param {Number} value value to test
|
490 |
* @param {Array} others values to compare with
|
491 |
* @return {Boolean} true if `value` is less than `others` values
|
492 |
* @api public
|
493 |
*/
|
494 |
|
495 |
is.minimum = function (value, others) { |
496 |
if (isActualNaN(value)) {
|
497 |
throw new TypeError('NaN is not a valid value'); |
498 |
} else if (!is.arraylike(others)) { |
499 |
throw new TypeError('second argument must be array-like'); |
500 |
} |
501 |
var len = others.length;
|
502 |
|
503 |
while (--len >= 0) { |
504 |
if (value > others[len]) {
|
505 |
return false; |
506 |
} |
507 |
} |
508 |
|
509 |
return true; |
510 |
}; |
511 |
|
512 |
/**
|
513 |
* is.nan
|
514 |
* Test if `value` is not a number.
|
515 |
*
|
516 |
* @param {Mixed} value value to test
|
517 |
* @return {Boolean} true if `value` is not a number, false otherwise
|
518 |
* @api public
|
519 |
*/
|
520 |
|
521 |
is.nan = function (value) { |
522 |
return !is.number(value) || value !== value;
|
523 |
}; |
524 |
|
525 |
/**
|
526 |
* is.even
|
527 |
* Test if `value` is an even number.
|
528 |
*
|
529 |
* @param {Number} value value to test
|
530 |
* @return {Boolean} true if `value` is an even number, false otherwise
|
531 |
* @api public
|
532 |
*/
|
533 |
|
534 |
is.even = function (value) { |
535 |
return is.infinite(value) || (is.number(value) && value === value && value % 2 === 0); |
536 |
}; |
537 |
|
538 |
/**
|
539 |
* is.odd
|
540 |
* Test if `value` is an odd number.
|
541 |
*
|
542 |
* @param {Number} value value to test
|
543 |
* @return {Boolean} true if `value` is an odd number, false otherwise
|
544 |
* @api public
|
545 |
*/
|
546 |
|
547 |
is.odd = function (value) { |
548 |
return is.infinite(value) || (is.number(value) && value === value && value % 2 !== 0); |
549 |
}; |
550 |
|
551 |
/**
|
552 |
* is.ge
|
553 |
* Test if `value` is greater than or equal to `other`.
|
554 |
*
|
555 |
* @param {Number} value value to test
|
556 |
* @param {Number} other value to compare with
|
557 |
* @return {Boolean}
|
558 |
* @api public
|
559 |
*/
|
560 |
|
561 |
is.ge = function (value, other) { |
562 |
if (isActualNaN(value) || isActualNaN(other)) {
|
563 |
throw new TypeError('NaN is not a valid value'); |
564 |
} |
565 |
return !is.infinite(value) && !is.infinite(other) && value >= other;
|
566 |
}; |
567 |
|
568 |
/**
|
569 |
* is.gt
|
570 |
* Test if `value` is greater than `other`.
|
571 |
*
|
572 |
* @param {Number} value value to test
|
573 |
* @param {Number} other value to compare with
|
574 |
* @return {Boolean}
|
575 |
* @api public
|
576 |
*/
|
577 |
|
578 |
is.gt = function (value, other) { |
579 |
if (isActualNaN(value) || isActualNaN(other)) {
|
580 |
throw new TypeError('NaN is not a valid value'); |
581 |
} |
582 |
return !is.infinite(value) && !is.infinite(other) && value > other;
|
583 |
}; |
584 |
|
585 |
/**
|
586 |
* is.le
|
587 |
* Test if `value` is less than or equal to `other`.
|
588 |
*
|
589 |
* @param {Number} value value to test
|
590 |
* @param {Number} other value to compare with
|
591 |
* @return {Boolean} if 'value' is less than or equal to 'other'
|
592 |
* @api public
|
593 |
*/
|
594 |
|
595 |
is.le = function (value, other) { |
596 |
if (isActualNaN(value) || isActualNaN(other)) {
|
597 |
throw new TypeError('NaN is not a valid value'); |
598 |
} |
599 |
return !is.infinite(value) && !is.infinite(other) && value <= other;
|
600 |
}; |
601 |
|
602 |
/**
|
603 |
* is.lt
|
604 |
* Test if `value` is less than `other`.
|
605 |
*
|
606 |
* @param {Number} value value to test
|
607 |
* @param {Number} other value to compare with
|
608 |
* @return {Boolean} if `value` is less than `other`
|
609 |
* @api public
|
610 |
*/
|
611 |
|
612 |
is.lt = function (value, other) { |
613 |
if (isActualNaN(value) || isActualNaN(other)) {
|
614 |
throw new TypeError('NaN is not a valid value'); |
615 |
} |
616 |
return !is.infinite(value) && !is.infinite(other) && value < other;
|
617 |
}; |
618 |
|
619 |
/**
|
620 |
* is.within
|
621 |
* Test if `value` is within `start` and `finish`.
|
622 |
*
|
623 |
* @param {Number} value value to test
|
624 |
* @param {Number} start lower bound
|
625 |
* @param {Number} finish upper bound
|
626 |
* @return {Boolean} true if 'value' is is within 'start' and 'finish'
|
627 |
* @api public
|
628 |
*/
|
629 |
is.within = function (value, start, finish) { |
630 |
if (isActualNaN(value) || isActualNaN(start) || isActualNaN(finish)) {
|
631 |
throw new TypeError('NaN is not a valid value'); |
632 |
} else if (!is.number(value) || !is.number(start) || !is.number(finish)) { |
633 |
throw new TypeError('all arguments must be numbers'); |
634 |
} |
635 |
var isAnyInfinite = is.infinite(value) || is.infinite(start) || is.infinite(finish);
|
636 |
return isAnyInfinite || (value >= start && value <= finish);
|
637 |
}; |
638 |
|
639 |
/**
|
640 |
* Test object.
|
641 |
*/
|
642 |
|
643 |
/**
|
644 |
* is.object
|
645 |
* Test if `value` is an object.
|
646 |
*
|
647 |
* @param {Mixed} value value to test
|
648 |
* @return {Boolean} true if `value` is an object, false otherwise
|
649 |
* @api public
|
650 |
*/
|
651 |
|
652 |
is.object = function (value) { |
653 |
return value && '[object Object]' === toString.call(value); |
654 |
}; |
655 |
|
656 |
/**
|
657 |
* is.hash
|
658 |
* Test if `value` is a hash - a plain object literal.
|
659 |
*
|
660 |
* @param {Mixed} value value to test
|
661 |
* @return {Boolean} true if `value` is a hash, false otherwise
|
662 |
* @api public
|
663 |
*/
|
664 |
|
665 |
is.hash = function (value) { |
666 |
return is.object(value) && value.constructor === Object && !value.nodeType && !value.setInterval;
|
667 |
}; |
668 |
|
669 |
/**
|
670 |
* Test regexp.
|
671 |
*/
|
672 |
|
673 |
/**
|
674 |
* is.regexp
|
675 |
* Test if `value` is a regular expression.
|
676 |
*
|
677 |
* @param {Mixed} value value to test
|
678 |
* @return {Boolean} true if `value` is a regexp, false otherwise
|
679 |
* @api public
|
680 |
*/
|
681 |
|
682 |
is.regexp = function (value) { |
683 |
return '[object RegExp]' === toString.call(value); |
684 |
}; |
685 |
|
686 |
/**
|
687 |
* Test string.
|
688 |
*/
|
689 |
|
690 |
/**
|
691 |
* is.string
|
692 |
* Test if `value` is a string.
|
693 |
*
|
694 |
* @param {Mixed} value value to test
|
695 |
* @return {Boolean} true if 'value' is a string, false otherwise
|
696 |
* @api public
|
697 |
*/
|
698 |
|
699 |
is.string = function (value) { |
700 |
return '[object String]' === toString.call(value); |
701 |
}; |
702 |
|