1'use strict'; 2 3var callBound = require('call-bind/callBound'); 4var hasToStringTag = require('has-tostringtag/shams')(); 5var has; 6var $exec; 7var isRegexMarker; 8var badStringifier; 9 10if (hasToStringTag) { 11 has = callBound('Object.prototype.hasOwnProperty'); 12 $exec = callBound('RegExp.prototype.exec'); 13 isRegexMarker = {}; 14 15 var throwRegexMarker = function () { 16 throw isRegexMarker; 17 }; 18 badStringifier = { 19 toString: throwRegexMarker, 20 valueOf: throwRegexMarker 21 }; 22 23 if (typeof Symbol.toPrimitive === 'symbol') { 24 badStringifier[Symbol.toPrimitive] = throwRegexMarker; 25 } 26} 27 28var $toString = callBound('Object.prototype.toString'); 29var gOPD = Object.getOwnPropertyDescriptor; 30var regexClass = '[object RegExp]'; 31 32module.exports = hasToStringTag 33 // eslint-disable-next-line consistent-return 34 ? function isRegex(value) { 35 if (!value || typeof value !== 'object') { 36 return false; 37 } 38 39 var descriptor = gOPD(value, 'lastIndex'); 40 var hasLastIndexDataProperty = descriptor && has(descriptor, 'value'); 41 if (!hasLastIndexDataProperty) { 42 return false; 43 } 44 45 try { 46 $exec(value, badStringifier); 47 } catch (e) { 48 return e === isRegexMarker; 49 } 50 } 51 : function isRegex(value) { 52 // In older browsers, typeof regex incorrectly returns 'function' 53 if (!value || (typeof value !== 'object' && typeof value !== 'function')) { 54 return false; 55 } 56 57 return $toString(value) === regexClass; 58 }; 59