index.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. 'use strict';
  2. var forEach = require('for-each');
  3. var availableTypedArrays = require('available-typed-arrays');
  4. var callBound = require('call-bind/callBound');
  5. var $toString = callBound('Object.prototype.toString');
  6. var hasToStringTag = require('has-tostringtag/shams')();
  7. var gOPD = require('gopd');
  8. var g = typeof globalThis === 'undefined' ? global : globalThis;
  9. var typedArrays = availableTypedArrays();
  10. var $indexOf = callBound('Array.prototype.indexOf', true) || function indexOf(array, value) {
  11. for (var i = 0; i < array.length; i += 1) {
  12. if (array[i] === value) {
  13. return i;
  14. }
  15. }
  16. return -1;
  17. };
  18. var $slice = callBound('String.prototype.slice');
  19. var toStrTags = {};
  20. var getPrototypeOf = Object.getPrototypeOf; // require('getprototypeof');
  21. if (hasToStringTag && gOPD && getPrototypeOf) {
  22. forEach(typedArrays, function (typedArray) {
  23. var arr = new g[typedArray]();
  24. if (Symbol.toStringTag in arr) {
  25. var proto = getPrototypeOf(arr);
  26. var descriptor = gOPD(proto, Symbol.toStringTag);
  27. if (!descriptor) {
  28. var superProto = getPrototypeOf(proto);
  29. descriptor = gOPD(superProto, Symbol.toStringTag);
  30. }
  31. toStrTags[typedArray] = descriptor.get;
  32. }
  33. });
  34. }
  35. var tryTypedArrays = function tryAllTypedArrays(value) {
  36. var anyTrue = false;
  37. forEach(toStrTags, function (getter, typedArray) {
  38. if (!anyTrue) {
  39. try {
  40. anyTrue = getter.call(value) === typedArray;
  41. } catch (e) { /**/ }
  42. }
  43. });
  44. return anyTrue;
  45. };
  46. module.exports = function isTypedArray(value) {
  47. if (!value || typeof value !== 'object') { return false; }
  48. if (!hasToStringTag || !(Symbol.toStringTag in value)) {
  49. var tag = $slice($toString(value), 8, -1);
  50. return $indexOf(typedArrays, tag) > -1;
  51. }
  52. if (!gOPD) { return false; }
  53. return tryTypedArrays(value);
  54. };