JavaScript数组复制详解

在 JavaScript 中,复制数组是一个常见的操作。本文将详细介绍如何使用不同的方法来复制数组,并讨论它们的优缺点。

直接赋值

最简单的方法是通过直接赋值来复制数组:

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

这个方法看起来非常简单,但是需要注意的是,这并不会创建一个新的数组对象。相反,copiedArray 只是指向了 originalArray,即使我们对 copiedArray 进行修改,originalArray 也会随之改变。因此,这种方法适用于只读数组的情况,但如果你想修改拷贝后的数组而不影响原数组,需要使用其他方法。

浅拷贝

浅拷贝是一种创建新数组并将原始数组的元素复制到新数组中的方法。但是,如果原始数组中的元素本身是对象或其他引用类型,则复制的只是其引用,而不是实际的值。

使用 slice()

JavaScript 数组提供了 slice() 方法,可以返回从原始数组中选择的元素,以新数组形式返回。如果不传参数,则该方法将复制整个数组。例如:

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

在上面的代码中,copiedArrayoriginalArray 的浅拷贝。如果我们修改 originalArray 中的对象(即 {a: 'apple'}),则 copiedArray 也会发生变化。

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

使用 concat()

另一个创建浅拷贝的方法是使用 concat() 方法。它将两个或多个数组合并成一个新数组,并返回该新数组。例如:

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

在上面的代码中,copiedArrayoriginalArray 的浅拷贝。同样地,如果我们修改 originalArray 中的对象,则 copiedArray 也会发生变化。

深拷贝

深拷贝是一种创建新数组并将原始数组的元素和所有嵌套对象都复制到新数组中的方法。这是因为,与浅拷贝不同,深拷贝会同时复制对象本身和其引用指向的对象。

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

一种常见的深拷贝数组的方式是使用 JSON.parse()JSON.stringify() 方法。首先,使用 JSON.stringify() 将原始数组转换为 JSON 字符串,然后使用 JSON.parse() 将该字符串解析为新数组。例如:

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

在上面的代码中,copiedArrayoriginalArray 的深拷贝。因为使用了 JSON.stringify()JSON.parse() 方法,所以所有嵌套对象都被正确地复制。

使用递归实现深拷贝

如果不想使用 JSON.parse()JSON.stringify() 方法,还可以使用递归来实现深拷贝。该方法会遍历原始数组并复制其元素。如果元素是对象或数组,则递归调用该方法以创建新的对象或数组。例如:

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

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