index.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. var isBuffer = require('is-buffer');
  2. var toString = Object.prototype.toString;
  3. /**
  4. * Get the native `typeof` a value.
  5. *
  6. * @param {*} `val`
  7. * @return {*} Native javascript type
  8. */
  9. module.exports = function kindOf(val) {
  10. // primitivies
  11. if (typeof val === 'undefined') {
  12. return 'undefined';
  13. }
  14. if (val === null) {
  15. return 'null';
  16. }
  17. if (val === true || val === false || val instanceof Boolean) {
  18. return 'boolean';
  19. }
  20. if (typeof val === 'string' || val instanceof String) {
  21. return 'string';
  22. }
  23. if (typeof val === 'number' || val instanceof Number) {
  24. return 'number';
  25. }
  26. // functions
  27. if (typeof val === 'function' || val instanceof Function) {
  28. return 'function';
  29. }
  30. // array
  31. if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) {
  32. return 'array';
  33. }
  34. // check for instances of RegExp and Date before calling `toString`
  35. if (val instanceof RegExp) {
  36. return 'regexp';
  37. }
  38. if (val instanceof Date) {
  39. return 'date';
  40. }
  41. // other objects
  42. var type = toString.call(val);
  43. if (type === '[object RegExp]') {
  44. return 'regexp';
  45. }
  46. if (type === '[object Date]') {
  47. return 'date';
  48. }
  49. if (type === '[object Arguments]') {
  50. return 'arguments';
  51. }
  52. if (type === '[object Error]') {
  53. return 'error';
  54. }
  55. // buffer
  56. if (isBuffer(val)) {
  57. return 'buffer';
  58. }
  59. // es6: Map, WeakMap, Set, WeakSet
  60. if (type === '[object Set]') {
  61. return 'set';
  62. }
  63. if (type === '[object WeakSet]') {
  64. return 'weakset';
  65. }
  66. if (type === '[object Map]') {
  67. return 'map';
  68. }
  69. if (type === '[object WeakMap]') {
  70. return 'weakmap';
  71. }
  72. if (type === '[object Symbol]') {
  73. return 'symbol';
  74. }
  75. // typed arrays
  76. if (type === '[object Int8Array]') {
  77. return 'int8array';
  78. }
  79. if (type === '[object Uint8Array]') {
  80. return 'uint8array';
  81. }
  82. if (type === '[object Uint8ClampedArray]') {
  83. return 'uint8clampedarray';
  84. }
  85. if (type === '[object Int16Array]') {
  86. return 'int16array';
  87. }
  88. if (type === '[object Uint16Array]') {
  89. return 'uint16array';
  90. }
  91. if (type === '[object Int32Array]') {
  92. return 'int32array';
  93. }
  94. if (type === '[object Uint32Array]') {
  95. return 'uint32array';
  96. }
  97. if (type === '[object Float32Array]') {
  98. return 'float32array';
  99. }
  100. if (type === '[object Float64Array]') {
  101. return 'float64array';
  102. }
  103. // must be a plain object
  104. return 'object';
  105. };