You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

is.js 1.2KB

12345678910111213141516171819202122232425262728293031323334353637
  1. "use strict";
  2. var isToStringTagSupported = require("../lib/is-to-string-tag-supported")
  3. , isPrototype = require("../prototype/is");
  4. var regExpTest = RegExp.prototype.test
  5. , objectToString = Object.prototype.toString
  6. , objectTaggedString = objectToString.call(/a/);
  7. module.exports = function (value) {
  8. if (!value) return false;
  9. // Sanity check (reject objects which do not expose common RegExp interface)
  10. if (!hasOwnProperty.call(value, "lastIndex")) return false;
  11. try {
  12. if (typeof value.lastIndex !== "number") return false;
  13. if (typeof value.test !== "function") return false;
  14. if (typeof value.exec !== "function") return false;
  15. } catch (error) {
  16. return false;
  17. }
  18. // Ensure its native RegExp object (has [[RegExpMatcher]] slot)
  19. if (isToStringTagSupported && typeof value[Symbol.toStringTag] === "string") {
  20. // Edge case (possibly a regExp with custom Symbol.toStringTag)
  21. try {
  22. var lastIndex = value.lastIndex;
  23. regExpTest.call(value, "");
  24. if (value.lastIndex !== lastIndex) value.lastIndex = lastIndex;
  25. return true;
  26. } catch (error) {
  27. return false;
  28. }
  29. }
  30. if (objectToString.call(value) !== objectTaggedString) return false;
  31. return !isPrototype(value);
  32. };