综合手写深拷贝,浅拷贝

  1. let obj1 = {
  2. name: '赵敏',
  3. age: 11,
  4. hobbit: {
  5. eat: '香蕉'
  6. }
  7. }
  8. let obj2 = deepClone(obj1)
  9. obj2.name = '张无忌'
  10. obj2.hobbit.eat = '苹果 '
  11. console.log('obj1', obj1)
  12. console.log('obj2', obj2)
  13. function deepClone(obj = {}) {
  14. // 如果是普通类型,直接返回
  15. if (typeof obj !== 'object' || typeof obj == null) {
  16. return obj
  17. }
  18. let result = Array.isArray(obj) ? [] : {}
  19. for (let key in obj) {
  20. if (obj.hasOwnProperty(key)) {
  21. result[key] = deepClone(obj[key])
  22. }
  23. }
  24. return result
  25. }

代码分解

  1. 如果拷贝变量是 let obj = 1 (基本数据类型)// 简单数据类型,直接返回。因为这不涉及拷贝,就是赋值好吧….

那怎么找判断基本数据类型呢, typeof 基本类型都会返回,复杂类型都会返回object,但是有一个特殊的null

  1. 复杂类型,判断是数组还是对象; Array.isArray(obj) obj instanceof Array
  2. 根据类型,给返回值初始化
  3. 循环赋值对象,以key,vale的形式赋值。 但是要在本身原型上查找 hasOwnProperty
  4. 对象嵌套对象,用递归克隆

    其他快捷方式

  5. Object.assign({},)

  6. {…}
  7. JSON.parse(JSON.stringify())
  8. lodash