JavaScript 中什么是浅拷贝 (Shallow Copy) 和深拷贝 (Deep Copy)?

推荐答案

在 JavaScript 中,浅拷贝(Shallow Copy)和深拷贝(Deep Copy)是两种不同的对象复制方式。

  • 浅拷贝(Shallow Copy):创建一个新对象,并将原始对象的属性值复制到新对象中。如果属性值是基本类型(如字符串、数字、布尔值等),则复制的是值本身;如果属性值是引用类型(如对象、数组等),则复制的是引用(即内存地址),因此新对象和原始对象会共享这些引用类型的属性。

  • 深拷贝(Deep Copy):创建一个新对象,并递归地复制原始对象的所有属性值,包括嵌套的对象和数组。深拷贝会创建一个完全独立的对象,新对象和原始对象不会共享任何引用类型的属性。

本题详细解读

浅拷贝的实现方式

  1. 使用 Object.assign()

  2. 使用展开运算符 ...

深拷贝的实现方式

  1. 使用 JSON.parse(JSON.stringify())

    注意:这种方法无法复制函数、undefinedSymbol 等特殊类型。

  2. 使用递归函数

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

浅拷贝与深拷贝的区别

  • 浅拷贝:只复制对象的第一层属性,嵌套的对象或数组仍然是共享的。
  • 深拷贝:递归地复制对象的所有层级,创建一个完全独立的对象。

使用场景

  • 浅拷贝:适用于对象结构简单,且不需要独立嵌套对象的情况。
  • 深拷贝:适用于对象结构复杂,且需要完全独立的对象副本的情况。

注意事项

  • 深拷贝可能会带来性能问题,特别是在处理大型对象或嵌套层级很深的对象时。
  • 深拷贝可能会丢失一些特殊类型的数据(如函数、undefinedSymbol 等),需要根据具体需求选择合适的深拷贝方法。
纠错
反馈