对象接收表情参数怎么去除_JavaScript中对象的浅复制和深复制

原创:前端二牛

56c8c7a20bb7d7ea62a1075965f2f724.png

在JavaScript中,如果要复制一个变量我们应该怎么做呢?下面这种做法是最简单的一种形式:

  1. //把a复制给b
  2. let a
  3. =
  4. 12
  5. ;
  6. let b
  7. =
  8. a
  9. ;

这种复制方法只能适用于基本类型,如果 a是对象怎么办呢?我们先来看看上面的代码在内存中做了什么事:

36096e545a22d037847ea27c5d9ee1b1.png

声明了变量 a=12,栈内存会分配一块区域来存储,如上图所示。把 a赋给 b,会在栈中重新开辟一块区域来存储 b,并且 b的值就是 a的值。

假如 a是对象,内存做了什么事呢?来看下面的例子:

  1. let
  2. a
  3. =
  4. {};
  5. let
  6. b
  7. =
  8. a
  9. ;
cbcd0c1a13f5838fa204eb9a571eb579.png

如图所示,对象是存储在堆内存中的,栈中保存的是地址值,使用这种方式复制对象只不过是复制了该对象的引用而已,对象实体还是只有一个。那么对象应该怎样复制呢?对象的复制其实也就是产生一个一模一样的对象,对象包含属性和方法,我们创建一个新对象,将旧对象的属性和方法赋给新对象,这样不就是复制了一个对象吗?顺着这个思路,我们来看下面的代码:

  1. function
  2. copy
  3. (
  4. obj
  5. ){
  6. //基本类型和函数直接返回
  7. if
  8. (!(
  9. obj
  10. instanceof
  11. Object
  12. )
  13. ||
  14. typeof
  15. obj
  16. ===
  17. 'function'
  18. )
  19. return
  20. obj
  21. ;
  22. let newObj
  23. =
  24. {};
  25. if
  26. (
  27. obj
  28. instanceof
  29. Array
  30. )
  31. newObj
  32. =
  33. [];
  34. for
  35. (
  36. let p in obj
  37. ){
  38. newObj
  39. [
  40. p
  41. ]
  42. =
  43. obj
  44. [
  45. p
  46. ];
  47. }
  48. return
  49. newObj
  50. ;
  51. }
  52. let p
  53. =
  54. {
  55. name
  56. :
  57. 'bob'
  58. ,
  59. friends
  60. :
  61. [
  62. 'jack'
  63. ,
  64. 'rose'
  65. ]
  66. }
  67. let p2
  68. =
  69. copy
  70. (
  71. p
  72. );
  73. console
  74. .
  75. log
  76. (
  77. p2
  78. );

定义一个 copy函数,接收一个参数,用以实现对象的复制,如果参数是基本类型或函数就直接返回。函数体内声明一个新对象 newObj,然后遍历参数 obj,将其每一个属性都赋给 newObj,最后返回 newObj。接着使用 copy方法生成了 p的一个复制对象 p2,结果如下图所示:

dad4efd33dcc400848ea0dfe2d1cf17d.png

但是这样有一个问题,我们来看下面的代码:

  1. p2
  2. .
  3. friends
  4. .
  5. push
  6. (
  7. 'lily'
  8. );
  9. console
  10. .
  11. log
  12. (
  13. p2
  14. .
  15. friends
  16. );
  17. //["jack
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值