| 'use strict'; | |
| var has = require('has'); | |
| var regexExec = RegExp.prototype.exec; | |
| var gOPD = Object.getOwnPropertyDescriptor; | |
| var tryRegexExecCall = function tryRegexExec(value) { | |
| try { | |
| var lastIndex = value.lastIndex; | |
| value.lastIndex = 0; | |
| regexExec.call(value); | |
| return true; | |
| } catch (e) { | |
| return false; | |
| } finally { | |
| value.lastIndex = lastIndex; | |
| } | |
| }; | |
| var toStr = Object.prototype.toString; | |
| var regexClass = '[object RegExp]'; | |
| var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol'; | |
| module.exports = function isRegex(value) { | |
| if (!value || typeof value !== 'object') { | |
| return false; | |
| } | |
| if (!hasToStringTag) { | |
| return toStr.call(value) === regexClass; | |
| } | |
| var descriptor = gOPD(value, 'lastIndex'); | |
| var hasLastIndexDataProperty = descriptor && has(descriptor, 'value'); | |
| if (!hasLastIndexDataProperty) { | |
| return false; | |
| } | |
| return tryRegexExecCall(value); | |
| }; |