index.js 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. 'use strict';
  2. var callBound = require('call-bound');
  3. var $toString = callBound('Object.prototype.toString');
  4. var hasSymbols = require('has-symbols')();
  5. var safeRegexTest = require('safe-regex-test');
  6. if (hasSymbols) {
  7. var $symToStr = callBound('Symbol.prototype.toString');
  8. var isSymString = safeRegexTest(/^Symbol\(.*\)$/);
  9. /** @type {(value: object) => value is Symbol} */
  10. var isSymbolObject = function isRealSymbolObject(value) {
  11. if (typeof value.valueOf() !== 'symbol') {
  12. return false;
  13. }
  14. return isSymString($symToStr(value));
  15. };
  16. /** @type {import('.')} */
  17. module.exports = function isSymbol(value) {
  18. if (typeof value === 'symbol') {
  19. return true;
  20. }
  21. if (!value || typeof value !== 'object' || $toString(value) !== '[object Symbol]') {
  22. return false;
  23. }
  24. try {
  25. return isSymbolObject(value);
  26. } catch (e) {
  27. return false;
  28. }
  29. };
  30. } else {
  31. /** @type {import('.')} */
  32. module.exports = function isSymbol(value) {
  33. // this environment does not support Symbols.
  34. return false && value;
  35. };
  36. }