copyObj.js 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
  2. /**
  3. * @desc 深浅合并拷贝
  4. */
  5. function copyObj() {
  6. if (!Array.isArray) {
  7. Array.isArray = function (arg) {
  8. return Object.prototype.toString.call(arg) === '[object Array]';
  9. };
  10. }
  11. var name = void 0,
  12. options = void 0,
  13. src = void 0,
  14. copy = void 0,
  15. copyIsArray = void 0,
  16. clone = void 0,
  17. i = 1,
  18. target = arguments[0] || {},
  19. // 使用||运算符,排除隐式强制类型转换为false的数据类型
  20. deep = false,
  21. len = arguments.length;
  22. if (typeof target === 'boolean') {
  23. deep = target;
  24. target = arguments[1] || {};
  25. i++;
  26. }
  27. if ((typeof target === 'undefined' ? 'undefined' : _typeof(target)) !== 'object' && typeof target !== 'function') {
  28. target = {};
  29. }
  30. // 如果arguments.length === 1 或typeof arguments[0] === 'boolean',且存在arguments[1],则直接返回target对象
  31. if (i === len) {
  32. return target;
  33. }
  34. for (; i < len; i++) {
  35. //所以如果源对象中数据类型为Undefined或Null那么就会跳过本次循环,接着循环下一个源对象
  36. if ((options = arguments[i]) != null) {
  37. // 如果遇到源对象的数据类型为Boolean, Number for in循环会被跳过,不执行for in循环// src用于判断target对象是否存在name属性
  38. for (name in options) {
  39. // src用于判断target对象是否存在name属性
  40. src = target[name];
  41. // 需要复制的属性当前源对象的name属性
  42. copy = options[name];
  43. // 判断copy是否是数组
  44. copyIsArray = Array.isArray(copy);
  45. // 如果是深复制且copy是一个对象或数组则需要递归直到copy成为一个基本数据类型为止
  46. if (deep && copy && ((typeof copy === 'undefined' ? 'undefined' : _typeof(copy)) === 'object' || copyIsArray)) {
  47. if (copyIsArray) {
  48. copyIsArray = false;
  49. // 如果目标对象存在name属性且是一个数组
  50. // 则使用目标对象的name属性,否则重新创建一个数组,用于复制
  51. clone = src && Array.isArray(src) ? src : [];
  52. } else {
  53. // 如果目标对象存在name属性且是一个对象则使用目标对象的name属性,否则重新创建一个对象,用于复制
  54. clone = src && (typeof src === 'undefined' ? 'undefined' : _typeof(src)) === 'object' ? src : {};
  55. }
  56. // 深复制,所以递归调用copyObject函数
  57. // 返回值为target对象,即clone对象
  58. // copy是一个源对象
  59. target[name] = copyObj(deep, clone, copy);
  60. } else if (copy !== undefined) {
  61. // 浅复制,直接复制到target对象上
  62. target[name] = copy;
  63. }
  64. }
  65. }
  66. }
  67. return target;
  68. }
  69. module.exports = copyObj;