fclone.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. (function (root, factory) {
  2. if (typeof define === 'function' && define.amd) {
  3. // AMD
  4. define('fclone', [], factory);
  5. } else if (typeof module === 'object' && module.exports) {
  6. //node
  7. module.exports = factory();
  8. } else {
  9. // Browser globals (root is window)
  10. root.fclone = factory();
  11. }
  12. }(this, function () {
  13. 'use strict';
  14. // see if it looks and smells like an iterable object, and do accept length === 0
  15. var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; };
  16. function isArrayLike(item) {
  17. if (Array.isArray(item)) return true;
  18. var len = item && item.length;
  19. return typeof len === 'number' && (len === 0 || len - 1 in item) && typeof item.indexOf === 'function';
  20. }
  21. function fclone(obj, refs) {
  22. if (!obj || "object" !== (typeof obj === 'undefined' ? 'undefined' : _typeof(obj))) return obj;
  23. if (obj instanceof Date) {
  24. return new Date(obj);
  25. }
  26. if (typeof Buffer !== 'undefined' && Buffer.isBuffer(obj)) {
  27. return new Buffer(obj);
  28. }
  29. // typed array Int32Array etc.
  30. if (typeof obj.subarray === 'function' && /[A-Z][A-Za-z\d]+Array/.test(Object.prototype.toString.call(obj))) {
  31. return obj.subarray(0);
  32. }
  33. if (!refs) {
  34. refs = [];
  35. }
  36. if (isArrayLike(obj)) {
  37. refs[refs.length] = obj;
  38. var _l = obj.length;
  39. var i = -1;
  40. var _copy = [];
  41. while (_l > ++i) {
  42. _copy[i] = ~refs.indexOf(obj[i]) ? '[Circular]' : fclone(obj[i], refs);
  43. }
  44. refs.length && refs.length--;
  45. return _copy;
  46. }
  47. refs[refs.length] = obj;
  48. var copy = {};
  49. if (obj instanceof Error) {
  50. copy.name = obj.name;
  51. copy.message = obj.message;
  52. copy.stack = obj.stack;
  53. }
  54. var keys = Object.keys(obj);
  55. var l = keys.length;
  56. while (l--) {
  57. var k = keys[l];
  58. copy[k] = ~refs.indexOf(obj[k]) ? '[Circular]' : fclone(obj[k], refs);
  59. }
  60. refs.length && refs.length--;
  61. return copy;
  62. }
  63. fclone.default = fclone;
  64. return fclone
  65. }));