1. 深拷贝和浅拷贝都只针对引用数据类型
  2. 浅拷贝:会对对象逐个成员依次拷贝,但只复制内存地址,而不复制对象本身,新旧对象成员还是共享同一内存
  3. 深拷贝:会另外创建一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。

1- 浅拷贝

1-1 数组中每项是简单数据类型,实现浅拷贝

  1. var arr = [1,2,3]
  2. var sum = arr
  3. console.log(sum); // [1,2,3]
  4. arr.push(4)
  5. console.log(sum); // [1,2,3,4]

1-2 数组中每项是复杂数据类型 ,实现浅拷贝

  1. var arr = [{name:"zheng"},{name:"zhang"},{name:"li"}]
  2. var res = [...arr]
  3. res[0].name="huang" // arr变了
  4. res.push({name:"vue"})
  5. console.log(arr) // [{name:"huang"},{name:"zhang"},{name:"li"}]

深拷贝.png

2- 深拷贝

2-1 每项为简单数据类型(实现深拷贝)

1- 数组里每项是简单数据类型,实现深拷贝

  1. /* 数组里面 每一项是基本数据类型的 是深拷贝 */
  2. var arr = [1,2,3]
  3. var sum = [...arr]
  4. console.log(sum); //[1,2,3]
  5. arr.push(4)
  6. console.log(sum); // [1,2,3]
  7. var arr = [1,2,3]
  8. var sum = [].concat(arr)
  9. console.log(sum); // [1,2,3]
  10. arr.push(4)
  11. console.log(sum); //[1,2,3]
  12. var arr = [1,2,3]
  13. var sum = arr.slice(0)
  14. console.log(sum); // [1,2,3]
  15. arr.push(4)
  16. console.log(sum); // [1,2,3]

2- 对象的属性是简单数据类型,实现深拷贝

  1. # {...obj}
  2. # Object.assign({},obj)
  3. var obj = {name:"cheng",age:18}
  4. // var a = {...obj}
  5. var a = Object.assign({},obj)
  6. obj.id = 100;
  7. console.log(a) // {name:"cheng",age:18}

2-2 每项为复杂数据类型(array+object)

  1. // 遇到复杂类型(array+object)如何实现深拷贝
  2. // var obj = null
  3. var obj = {name:{name:"cheng"}}
  4. function deepClone(obj){
  5. // 1. 能够识别数组和对象了
  6. let result;
  7. if(obj instanceof Array || obj instanceof Object){
  8. // 2.对拷贝的值做初始值的设定
  9. if(obj instanceof Array){
  10. result = []
  11. }else if(typeof obj == "object"){
  12. result={}
  13. }
  14. // 3.需要将obj克隆到result中
  15. for(let key in obj){
  16. result[key] = deepClone(obj[key])
  17. }
  18. return result
  19. }else{
  20. return obj
  21. }
  22. }
  23. deepClone(obj)
  24. console.log(deepClone(obj))