| 'use strict'; |
| |
| var toArray = require('./to-array') |
| , isDate = require('../date/is-date') |
| , isRegExp = require('../reg-exp/is-reg-exp') |
| |
| , isArray = Array.isArray, stringify = JSON.stringify |
| , keyValueToString = function (value, key) { return stringify(key) + ':' + exports(value); }; |
| |
| var sparseMap = function (arr) { |
| var i, l = arr.length, result = new Array(l); |
| for (i = 0; i < l; ++i) { |
| if (!arr.hasOwnProperty(i)) continue; |
| result[i] = exports(arr[i]); |
| } |
| return result; |
| }; |
| |
| module.exports = exports = function (obj) { |
| if (obj == null) return String(obj); |
| switch (typeof obj) { |
| case 'string': |
| return stringify(obj); |
| case 'number': |
| case 'boolean': |
| case 'function': |
| return String(obj); |
| case 'object': |
| if (isArray(obj)) return '[' + sparseMap(obj) + ']'; |
| if (isRegExp(obj)) return String(obj); |
| if (isDate(obj)) return 'new Date(' + obj.valueOf() + ')'; |
| return '{' + toArray(obj, keyValueToString) + '}'; |
| default: |
| throw new TypeError("Serialization of " + String(obj) + "is unsupported"); |
| } |
| }; |