Guest User

Untitled

a guest
May 21st, 2018
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.91 KB | None | 0 0
  1. const getType = (obj) => {
  2. var toString = Object.prototype.toString;
  3. var map = {
  4. '[object Boolean]': 'boolean',
  5. '[object Number]': 'number',
  6. '[object String]': 'string',
  7. '[object Function]': 'function',
  8. '[object Array]': 'array',
  9. '[object Date]': 'date',
  10. '[object RegExp]': 'regExp',
  11. '[object Undefined]': 'undefined',
  12. '[object Null]': 'null',
  13. '[object Object]': 'object',
  14. '[object Symbol]': 'symbol'
  15. };
  16. if (obj instanceof Element) { //因为对不同标签,toString会返回对应不同标签的构造函数
  17. return 'element';
  18. }
  19. return map[toString.call(obj)];
  20. }
  21.  
  22. const getRegExp = re => {
  23. var flags = '';
  24. if (re.global) flags += 'g';
  25. if (re.ignoreCase) flags += 'i';
  26. if (re.multiline) flags += 'm';
  27. return flags;
  28. };
  29.  
  30. /**
  31. * deep clone
  32. * @param {[type]} parent object 需要进行克隆的对象
  33. * @return {[type]} 深克隆后的对象
  34. */
  35. const deepClone = oldObj => {
  36. // 维护两个储存循环引用的数组
  37. const oldObjArr = [];
  38. const newObjArr = [];
  39.  
  40. const clone = oldObj => {
  41.  
  42. let newObj, proto;
  43.  
  44. const type = getType(oldObj);
  45.  
  46. switch (type) {
  47. case 'boolean':
  48. case 'number':
  49. case 'string':
  50. case 'null':
  51. case 'undefined':
  52. case 'function':
  53. {
  54. return oldObj;
  55. break;
  56. }
  57. case 'symbol':
  58. {
  59. return Symbol(Symbol.keyFor(oldObj).toString());
  60. break;
  61. }
  62. case 'array':
  63. {
  64. newObj = [];
  65. break;
  66. }
  67. case 'regExp':
  68. {
  69. newObj = new RegExp(oldObj.source, getRegExp(oldObj));
  70. if (oldObj.lastIndex) newObj.lastIndex = oldObj.lastIndex;
  71. break;
  72. }
  73. case 'date':
  74. {
  75. newObj = new Date(oldObj.getTime());
  76. break;
  77. }
  78. //case 'obj':
  79. default:
  80. {
  81. // 处理对象原型
  82. proto = Object.getPrototypeOf(oldObj);
  83. // 利用Object.create切断原型链
  84. newObj = Object.create(proto);
  85. break;
  86. }
  87. }
  88.  
  89. // 处理循环引用
  90. const index = oldObjArr.indexOf(oldObj);
  91. if (index != -1) { // 如果父数组存在本对象,说明之前已经被引用过,直接返回此对象
  92. return newObjArr[index];
  93. }
  94.  
  95. oldObjArr.push(oldObj);
  96. newObjArr.push(newObj);
  97.  
  98. for (let i in oldObj) { // 递归
  99. newObj[i] = clone(oldObj[i]);
  100. }
  101.  
  102. return newObj;
  103. };
  104.  
  105.  
  106. return clone(oldObj);
  107. }
Add Comment
Please, Sign In to add comment