1、深拷贝和浅拷贝的概念

  1. 深拷贝和浅拷贝,深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。
  2. 浅拷贝:仅仅是指向被复制的内存地址,如果原地址发生改变,那么浅复制出来的对象也会相应的改变
  3. 深拷贝:在计算机创建一个新的内存地址用于存放复制的对象

2、实际的例子

2.1 浅拷贝

  1. let obj2 = {
  2. name: 'yw',
  3. age:100
  4. }
  5. obj = obj2;
  6. obj.age = 120
  7. console.log(obj.age);

2.2 深拷贝方法1(完全拷贝)

  1. var obj={
  2. a: 2,
  3. name: 'zs',
  4. arr:[1,2,3]
  5. }
  6. var objStr = JSON.stringify(obj);
  7. var obj1 = JSON.parse(objStr);
  8. obj1.arr.push(4);
  9. obj1.a = 10;
  10. console.log(obj);
  11. console.log(obj1);

2.3 深拷贝方法2(完全拷贝)

  1. var obj = {
  2. name: 'wsscat',
  3. age: 0
  4. }
  5. var deepCopy = function(source) {
  6. var result = {};
  7. for(var key in source) {
  8. if(typeof source[key] === 'object') {
  9. result[key] = deepCopy(source[key])
  10. } else {
  11. result[key] = source[key]
  12. }
  13. }
  14. return result;
  15. }
  16. var obj3 = deepCopy(obj)
  17. obj.name = 'autumns';
  18. console.log(obj);//Object {name: "autumns", age: 0}
  19. console.log(obj3);//Object {name: "wsscat", age: 0}

2.4 深拷贝方法3 for in 的方法只能拷贝第一层

  1. // for in 的方法只能拷贝第一层, 引用数据类型无法拷贝
  2. let obj = {
  3. name: 'yw',
  4. age: 18,
  5. arr:[1,2,3]
  6. }
  7. let obj2 = {}
  8. for (let p in obj) {
  9. obj2[p] = obj[p];
  10. }
  11. obj2.age = 10;
  12. obj2.arr.push(4);
  13. console.log(obj);
  14. console.log(obj2);

2.5 深拷贝方法4扩展运算符,也只能拷贝第一层

  1. //...obj 的方法只能拷贝第一层, 引用数据类型无法拷贝
  2. let obj = {
  3. name: 'yw',
  4. age: 18,
  5. arr: [1, 2, 3]
  6. }
  7. let obj2 = {
  8. ...obj
  9. }
  10. obj2.age = 10;
  11. obj2.arr.push(4);
  12. console.log(obj);
  13. console.log(obj2);