拷贝对象后,修改对象的值不影响另一方
浅拷贝只能拷贝一层对象。如果有对象的嵌套,那么浅拷贝将无能为力
深拷贝解决无限层的对象嵌套问题,实现彻底的拷贝

浅拷贝的实现方式

1.Object.assign

Object.assign拷贝的是对象的属性的引用,而不是对象本身

  1. var obj1 = {'a':1,'b':2,'c':3}
  2. var obj2 = {'a':2,'b':3}
  3. var copy = Object.assign(obj1,obj2)
  4. console.log(copy)
  5. //{a: 2, b: 3, c: 3}
  6. obj1.a = 4
  7. console.log(obj2)
  8. //{a: 2, b: 3}
  9. var obj3 = {
  10. 'a':{
  11. 'b':'1'
  12. },
  13. 'c':{
  14. 'd':'2'
  15. }
  16. }
  17. var obj4 = {}
  18. var copy2 = Object.assign(obj4,obj3)
  19. console.log(copy2)
  20. /*
  21. a: {b: 2}
  22. c: {d: "2"}
  23. */
  24. obj4.a.b = 2
  25. console.log(obj3.a.b) //2

2.concat浅拷贝数组

  1. var arr = [1,2]
  2. var arr2 = arr.concat()
  3. console.log(arr2) //[1,2]
  4. arr2.push(3) //[1,2,3]
  5. var arr3 = [1,[2,3]]
  6. var arr4 = arr3.concat()
  7. arr3[1][1] = 4
  8. console.log(arr4[1][1]) //4

3.slice

更concat一样

4. …展开运算符

更slice是一样的效果

  1. var arr5 = [1,2,3]
  2. var arr6 = [...arr5]

5.手动实现

  1. var arr7 = [] //空数组
  2. var shadowClone = function(target,sources){
  3. for(var prop in sources){
  4. if(target[prop] != sources[prop]){
  5. target[prop] = sources[prop]
  6. }
  7. }
  8. }
  9. var obj5 = {}