深拷贝

  1. function checkType(any) {
  2. return Object.prototype.toString.call(any).slice(8, -1)
  3. }
  4. function clone(any){
  5. if(checkType(any) === 'Object') { // 拷贝对象
  6. let o = {};
  7. for(let key in any) {
  8. o[key] = clone(any[key])
  9. }
  10. return o;
  11. } else if(checkType(any) === 'Array') { // 拷贝数组
  12. var arr = []
  13. for(let i = 0,leng = any.length;i<leng;i++) {
  14. arr[i] = clone(any[i])
  15. }
  16. return arr;
  17. } else if(checkType(any) === 'Function') { // 拷贝函数
  18. return new Function('return '+any.toString()).call(this)
  19. } else if(checkType(any) === 'Date') { // 拷贝日期
  20. return new Date(any.valueOf())
  21. } else if(checkType(any) === 'RegExp') { // 拷贝正则
  22. return new RegExp(any)
  23. } else if(checkType(any) === 'Map') { // 拷贝Map 集合
  24. let m = new Map()
  25. any.forEach((v,k)=>{
  26. m.set(k, clone(v))
  27. })
  28. return m
  29. } else if(checkType(any) === 'Set') { // 拷贝Set 集合
  30. let s = new Set()
  31. for(let val of any.values()) {
  32. s.add(clone(val))
  33. }
  34. return s
  35. }
  36. return any;
  37. }

深拷贝也可以使用JSON.stringifyJSON.parse来实现,但是对于属性和层级较多的对象,这样做性能会稍差一些,并且这样只能拷贝普通对象。

  1. const person = {name: 'Sam', age: 31, child: {name: 'Ann'}};
  2. const person2 = JSON.parse(JSON.stringify(person));

浅拷贝

  1. function shallowCopy(src) {
  2. var dst = {};
  3. for (var prop in src) {
  4. if (src.hasOwnProperty(prop)) {
  5. dst[prop] = src[prop];
  6. }
  7. }
  8. return dst;
  9. }