42 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			42 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| 
 | |
| var toArray  = require("./to-array")
 | |
|   , isDate   = require("../date/is-date")
 | |
|   , isValue  = require("../object/is-value")
 | |
|   , isRegExp = require("../reg-exp/is-reg-exp");
 | |
| 
 | |
| var isArray = Array.isArray
 | |
|   , stringify = JSON.stringify
 | |
|   , objHasOwnProperty = Object.prototype.hasOwnProperty;
 | |
| var keyValueToString = function (value, key) {
 | |
| 	return stringify(key) + ":" + module.exports(value);
 | |
| };
 | |
| 
 | |
| var sparseMap = function (arr) {
 | |
| 	var i, length = arr.length, result = new Array(length);
 | |
| 	for (i = 0; i < length; ++i) {
 | |
| 		if (!objHasOwnProperty.call(arr, i)) continue;
 | |
| 		result[i] = module.exports(arr[i]);
 | |
| 	}
 | |
| 	return result;
 | |
| };
 | |
| 
 | |
| module.exports = function (obj) {
 | |
| 	if (!isValue(obj)) 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");
 | |
| 	}
 | |
| };
 |