| '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); |
| }; |