_toString.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import _includes from "./_includes.js";
  2. import _map from "./_map.js";
  3. import _quote from "./_quote.js";
  4. import _toISOString from "./_toISOString.js";
  5. import keys from "../keys.js";
  6. import reject from "../reject.js";
  7. export default function _toString(x, seen) {
  8. var recur = function recur(y) {
  9. var xs = seen.concat([x]);
  10. return _includes(y, xs) ? '<Circular>' : _toString(y, xs);
  11. }; // mapPairs :: (Object, [String]) -> [String]
  12. var mapPairs = function (obj, keys) {
  13. return _map(function (k) {
  14. return _quote(k) + ': ' + recur(obj[k]);
  15. }, keys.slice().sort());
  16. };
  17. switch (Object.prototype.toString.call(x)) {
  18. case '[object Arguments]':
  19. return '(function() { return arguments; }(' + _map(recur, x).join(', ') + '))';
  20. case '[object Array]':
  21. return '[' + _map(recur, x).concat(mapPairs(x, reject(function (k) {
  22. return /^\d+$/.test(k);
  23. }, keys(x)))).join(', ') + ']';
  24. case '[object Boolean]':
  25. return typeof x === 'object' ? 'new Boolean(' + recur(x.valueOf()) + ')' : x.toString();
  26. case '[object Date]':
  27. return 'new Date(' + (isNaN(x.valueOf()) ? recur(NaN) : _quote(_toISOString(x))) + ')';
  28. case '[object Map]':
  29. return 'new Map(' + recur(Array.from(x)) + ')';
  30. case '[object Null]':
  31. return 'null';
  32. case '[object Number]':
  33. return typeof x === 'object' ? 'new Number(' + recur(x.valueOf()) + ')' : 1 / x === -Infinity ? '-0' : x.toString(10);
  34. case '[object Set]':
  35. return 'new Set(' + recur(Array.from(x).sort()) + ')';
  36. case '[object String]':
  37. return typeof x === 'object' ? 'new String(' + recur(x.valueOf()) + ')' : _quote(x);
  38. case '[object Undefined]':
  39. return 'undefined';
  40. default:
  41. if (typeof x.toString === 'function') {
  42. var repr = x.toString();
  43. if (repr !== '[object Object]') {
  44. return repr;
  45. }
  46. }
  47. return '{' + mapPairs(x, keys(x)).join(', ') + '}';
  48. }
  49. }