有c++基础就是轻松理解
5.png


6.png

对象的深浅克隆

7.png

  1. <body>
  2. <script>
  3. var obj1 = {
  4. a: 1,
  5. b: 2,
  6. c: [44, 55, 66]
  7. }
  8. var obj2 = {};
  9. for(var k in obj1) {
  10. // 每遍历一个k属性,就给obj2也添加一个同名的k属性
  11. // 值和obj1的k属性值相同
  12. obj2[k] = obj1[k];
  13. }
  14. // c属性的值是引用类型值,那么本质上obj1和obj2的c属性是内存中的同一个数组,并没有被克隆分开,也叫浅克隆
  15. obj1.c.push(77);
  16. console.log(obj2); // obj2的c属性这个数组也会被增加77,因为克隆的就是内存啊
  17. </script>
  18. </body>

8.png
代码如下:

  1. <body>
  2. <script>
  3. var obj1 = {
  4. a: 1,
  5. b: 2,
  6. c: [33, 44, {
  7. m: 55,
  8. n: 66,
  9. p: [77,88]
  10. }]
  11. };
  12. function deepClone(o) {
  13. // 要判断o是对象还是数组,数组也是对象,所以要写最前面
  14. if(Array.isArray(o)) {
  15. // 数组
  16. var result = [];
  17. for(var i = 0;i < o.length;i++) {
  18. result.push(deepClone(o[i]));
  19. }
  20. }
  21. else if(typeof o == 'object') {
  22. // 对象
  23. var result = {};
  24. for(var k in o) {
  25. result[k] = deepClone(o[k]);
  26. }
  27. }
  28. else {
  29. // 基本类型值
  30. var result = o;
  31. }
  32. return result;
  33. }
  34. var obj2 = deepClone(obj1);
  35. console.log(obj2);
  36. console.log(obj1.c == obj2.c); // false
  37. </script>
  38. </body>