如何使用 ES8 实现对象浅拷贝和深拷贝

阅读时长 5 分钟读完

在前端开发中,经常需要对对象进行复制以及传递数据。而在复制对象时,有时候需要的是对象的引用,而有时候则需要的是对象的副本。对于 JavaScript 开发者来说,实现对象的浅拷贝和深拷贝是必不可少的操作。

什么是浅拷贝和深拷贝?

当我们复制一个对象时,其实是将一个对象的引用复制给了新的对象。这时候,原对象和新对象指向的是同一个内存地址。当我们修改原对象时,新对象的值也会受到影响。

而浅拷贝则是复制了原对象的基本类型数据和引用类型数据的地址,新对象和原对象的引用类型数据指向同一个地址。这意味着,如果我们修改了新对象的引用类型数据,原对象也会被修改。

深拷贝则是完全复制原对象的数据,生成一个新的对象,新对象与原对象没有任何引用关系。

如何实现浅拷贝?

在 ES6 之前,我们可以使用 Object.assign(target, source) 实现对象的浅拷贝。但是 Object.assign 只是复制了对象的二级属性,如果目标对象中已经存在了这个属性,它就会被覆盖。而且,Object.assign 没有办法复制对象的所有属性,比如对象的原型链、不可枚举的属性等,因此我们需要使用 ES8 的 Object.getOwnPropertyDescriptors 和 Reflect.ownKeys 方法实现浅拷贝。

-- -------------------- ---- -------
---
 - --------
 - ------ -------- ------ ----
 - ------ -------- ------ ---
 - ------- -------- ----
 --
-------- -------------------- ------- -
  ----- ----------- - -----------------------------------------
  --- ------ --- -- ----------------------------- -
    -- ---- --- ------------- -- --- --- ----------- -- --- --- ------- -
      ----------------------
        -------
        ----
        --------------------------------------- ----
      --
    -
  -
  ------ -------
-

如何实现深拷贝?

实现深拷贝需要递归复制对象的属性,直到复制完所有的属性。我们可以使用 JSON.parse(JSON.stringify(object)) 实现深拷贝,但是这种方法虽然简单,但是会存在一些问题,比如它不能复制特殊类型的属性,比如 Date, RegExp, Error 等等。而且,它也不能复制对象的原型链。因此,我们需要使用递归的函数遍历对象的属性,然后将属性一一复制到新的对象上。

-- -------------------- ---- -------
---
 - --------
 - ------ -------- --- ------
 - ------- -------- ----
 --
-------- -------------- -
  -------- ----------------------- -
    ----- ------ - --------------------- - -- - ---
    ------------------------------------- -- -
      ----- ----- - ------------
      -- ------- ----- --- -------- -- ----- --- ----- -
        ----------- - -----------------------
      - ---- -
        ----------- - ------
      -
    ---
    ------ -------
  -
  ------ ---------------------
-

使用以上代码,我们就可以实现对象的浅拷贝和深拷贝了。让我们来看一下具体的示例。

示例代码

-- -------------------- ---- -------
-- --------
----- ------ - -
  ----- -------
  ---- ---
  ------ ----------- ---------
--
----- ------------ - ---
-------------------------- --------
----------------------------------
-------------------------- -- ----------- -------- ---------

-- --------
----- ---- - -
  ----- --------
  ---- ---
  ------- -
    --------- -------- ------ --------------
    -------- ----------- -------
  --
--
----- ---------- - ----------------
----------------------------------------------
---------------------------------- -- -------- ------ -------------

总结

在 JavaScript 中实现对象的浅拷贝和深拷贝是一项很重要的技能。通过使用 ES8 的 Object.getOwnPropertyDescriptors 和 Reflect.ownKeys 方法,我们可以实现对象的浅拷贝。而使用递归方法遍历对象的属性,我们也可以实现对象的深拷贝。在开发中,根据具体的需求,我们可以选择合适的方式实现对象的复制。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/646c5843968c7c53b0b561dd

纠错
反馈