isEmptyable.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. // noinspection ES6ConvertVarToLetConst
  2. export default function isEmptyable(value) {
  3. return !_isNil &&
  4. (looksLikeArray(value) ||
  5. looksLikeMap(value) ||
  6. isPrototype(value) ||
  7. isKeyedObject(value)
  8. )
  9. function looksLikeArray(value) {
  10. return _isArrayLike(value) && (_isArray(value) || typeof value == "string" || typeof value.splice == "function" || _isBuffer(value) || _isTypedArray(value) || _isArguments(value))
  11. }
  12. function looksLikeMap(value) {
  13. const tag = getTag(value)
  14. const mapTag = "[object Map]"
  15. const setTag = "[object Set]"
  16. return (tag === mapTag) || (tag === setTag)
  17. }
  18. function isKeyedObject(value) {
  19. return _isObject(value) && (_keys(value).length > 0)
  20. }
  21. // lodash internals
  22. function isPrototype(value) {
  23. const objectProto = Object.prototype
  24. const Ctor = value && value.constructor
  25. const proto = (typeof Ctor === "function" && Ctor.prototype) || objectProto
  26. return value === proto
  27. }
  28. function getTag(value) {
  29. const nullTag = "[object Null]"
  30. const symToStringTag = Symbol ? Symbol.toStringTag : undefined
  31. const undefinedTag = "[object Undefined]"
  32. const objectProto = Object.prototype
  33. const hasOwnProperty = objectProto.hasOwnProperty
  34. const nativeObjectToString = objectProto.toString
  35. if (value == null) {
  36. return value === undefined ? undefinedTag : nullTag
  37. }
  38. return symToStringTag && symToStringTag in Object(value)
  39. ? getRawTag(value)
  40. : objectToString(value)
  41. function getRawTag(value) {
  42. const isOwn = hasOwnProperty.call(value, symToStringTag)
  43. const tag = value[symToStringTag]
  44. try {
  45. value[symToStringTag] = undefined
  46. var unmasked = true
  47. } catch (e) {
  48. }
  49. const result = nativeObjectToString.call(value)
  50. if (unmasked) {
  51. if (isOwn) {
  52. value[symToStringTag] = tag
  53. } else {
  54. delete value[symToStringTag]
  55. }
  56. }
  57. return result
  58. }
  59. function objectToString(value) {
  60. return nativeObjectToString.call(value)
  61. }
  62. }
  63. }