'use strict'; var callBound = require('call-bound'); var $toString = callBound('Object.prototype.toString'); var hasSymbols = require('has-symbols')(); var safeRegexTest = require('safe-regex-test'); if (hasSymbols) { var $symToStr = callBound('Symbol.prototype.toString'); var isSymString = safeRegexTest(/^Symbol\(.*\)$/); /** @type {(value: object) => value is Symbol} */ var isSymbolObject = function isRealSymbolObject(value) { if (typeof value.valueOf() !== 'symbol') { return false; } return isSymString($symToStr(value)); }; /** @type {import('.')} */ module.exports = function isSymbol(value) { if (typeof value === 'symbol') { return true; } if (!value || typeof value !== 'object' || $toString(value) !== '[object Symbol]') { return false; } try { return isSymbolObject(value); } catch (e) { return false; } }; } else { /** @type {import('.')} */ module.exports = function isSymbol(value) { // this environment does not support Symbols. return false && value; }; }