isEmpty.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. var getTag = require('./_getTag'),
  2. isArguments = require('./isArguments'),
  3. isArray = require('./isArray'),
  4. isArrayLike = require('./isArrayLike'),
  5. isBuffer = require('./isBuffer'),
  6. isFunction = require('./isFunction'),
  7. isObjectLike = require('./isObjectLike'),
  8. isString = require('./isString'),
  9. keys = require('./keys');
  10. /** `Object#toString` result references. */
  11. var mapTag = '[object Map]',
  12. setTag = '[object Set]';
  13. /** Used for built-in method references. */
  14. var objectProto = Object.prototype;
  15. /** Used to check objects for own properties. */
  16. var hasOwnProperty = objectProto.hasOwnProperty;
  17. /** Built-in value references. */
  18. var propertyIsEnumerable = objectProto.propertyIsEnumerable;
  19. /** Detect if properties shadowing those on `Object.prototype` are non-enumerable. */
  20. var nonEnumShadows = !propertyIsEnumerable.call({ 'valueOf': 1 }, 'valueOf');
  21. /**
  22. * Checks if `value` is an empty object, collection, map, or set.
  23. *
  24. * Objects are considered empty if they have no own enumerable string keyed
  25. * properties.
  26. *
  27. * Array-like values such as `arguments` objects, arrays, buffers, strings, or
  28. * jQuery-like collections are considered empty if they have a `length` of `0`.
  29. * Similarly, maps and sets are considered empty if they have a `size` of `0`.
  30. *
  31. * @static
  32. * @memberOf _
  33. * @since 0.1.0
  34. * @category Lang
  35. * @param {*} value The value to check.
  36. * @returns {boolean} Returns `true` if `value` is empty, else `false`.
  37. * @example
  38. *
  39. * _.isEmpty(null);
  40. * // => true
  41. *
  42. * _.isEmpty(true);
  43. * // => true
  44. *
  45. * _.isEmpty(1);
  46. * // => true
  47. *
  48. * _.isEmpty([1, 2, 3]);
  49. * // => false
  50. *
  51. * _.isEmpty({ 'a': 1 });
  52. * // => false
  53. */
  54. function isEmpty(value) {
  55. if (isArrayLike(value) &&
  56. (isArray(value) || isString(value) || isFunction(value.splice) ||
  57. isArguments(value) || isBuffer(value))) {
  58. return !value.length;
  59. }
  60. if (isObjectLike(value)) {
  61. var tag = getTag(value);
  62. if (tag == mapTag || tag == setTag) {
  63. return !value.size;
  64. }
  65. }
  66. for (var key in value) {
  67. if (hasOwnProperty.call(value, key)) {
  68. return false;
  69. }
  70. }
  71. return !(nonEnumShadows && keys(value).length);
  72. }
  73. module.exports = isEmpty;