如何在 ES6 中克隆数组?


在 ES5 中,我们使用 concat 方法来创建数组的副本。一些开发者也使用 slice() 方法,传入 0 作为参数来切片引用数组的所有元素并创建一个新数组。

示例

用户可以按照以下示例使用 slice() 方法克隆数组。我们创建了 array1,其中包含不同数据类型的值。之后,我们使用 slice() 方法创建 array1 的副本,并将其存储在 ‘clone’ 变量中。

Open Compiler
<html> <body> <h2>Using the <i>slice()</i> method to clone the array in JavaScript</h2> <div id = "output"> </div> <script> let output = document.getElementById('output'); let array1 = [10, "hello", 30, true]; output.innerHTML += "The original array: " + array1 + " <br>"; let clone = array1.slice(0); output.innerHTML += "The cloned array: " + clone + " <br>"; </script> </body> </html>

用户已经了解了我们在 ES5 中如何克隆数组。

此外,用户可以考虑像复制普通变量(如字符串、数字和布尔值)一样使用赋值运算符来复制数组。

用户在使用赋值运算符复制数组时可能会遇到问题。让我们通过下面的例子来理解它。

使用赋值运算符复制数组

在下面的示例中,strings 数组包含各种字符串。我们将 strings 数组赋值给 strings2 数组。之后,我们将新的字符串值推入 strings2 数组。

示例

Open Compiler
<html> <body> <h2>Using the <i>assignment</i> operator to clone the array in JavaScript</h2> <div id = "output"> </div> <script> let output = document.getElementById('output'); let array1 = ["Hi", " users", "Welcome"]; let array2 = array1; array2.push("New value"); output.innerHTML += "The value of array2: " + array2 + " <br>"; output.innerHTML += "The value of array1: " + array1 + " <br>"; </script> </body> </html>

在上面的输出中,用户可以观察到,当我们将字符串值推入 strings2 数组时,它也推入了 strings 数组。为什么会这样?

这里,可变和不可变对象的概念就派上用场了。

可变对象与不可变对象

在 JavaScript 中,数组和对象是可变的,这意味着我们可以在创建它们之后更改它们的值。因此,在上面的示例中,strings2 数组并不存在。当我们将 strings 数组赋值给 strings2 数组时,它会生成对 strings 数组的引用。因此,每当我们更改 strings2 数组时,它也会更改 strings 数组。

所以,我们需要创建一个数组的实际副本,而无需引用另一个数组。

现在,让我们学习如何在 ES6 中克隆数组。

在 ES6 中使用扩展运算符 (…) 克隆数组

扩展运算符的语法是三个点 (…)。我们可以使用它来展开可迭代对象,例如数组。扩展运算符会创建一个数组或对象的新的副本。

语法

用户可以按照以下语法使用扩展运算符复制数组。

let booleansCopy = [...booleans];

示例

在下面的示例中,我们创建了一个 boolean 数组,其中包含不同的布尔值。之后,我们使用扩展运算符创建了 boolean 数组的副本,并将该副本赋值给 booleanCopy 变量。

在输出中,用户可以观察到 booleanCopy 数组包含与 boolean 数组相同的值。

Open Compiler
<html> <body> <h2>Using the <i> spread operator </i> to clone the array in JavaScript</h2> <div id = "output"> </div> <script> let output = document.getElementById('output'); let booleans = [true, false, false, true, true]; let booleansCopy = [...booleans]; output.innerHTML += "The values of the booleansCopy array: " + booleansCopy + "<br>"; </script> </body> </html>

示例

在下面的示例中,sizes 数组包含不同的数字值。我们使用扩展运算符创建了 sizes 数组的副本,并使用赋值运算符将该数组存储在 sizesClone 变量中。

之后,我们将 60 推入 sizesClone 数组。

Open Compiler
<html> <body> <h2>Using the <i>spread</i> operator to clone the array in JavaScript</h2> <div id = "output"> </div> <script> let output = document.getElementById('output'); let sizes = [34, 43, 45, 47, 49, 50]; output.innerHTML += "-------Before Push-------" + "<br>"; output.innerHTML += "The values of the sizes array: " + sizes + "<br>"; let sizesClone = [...sizes]; output.innerHTML += "The values of the sizesClone array: " + sizesClone + "<br>"; sizesClone.push(60); output.innerHTML += "------After Push------" + "<br>"; output.innerHTML += "The values of the sizes array: " + sizes + "<br>"; output.innerHTML += "The values of the sizesClone array:" + sizesClone + "<br>"; </script> </body> </html>

在上面的输出中,用户可以观察到 60 反映在 *sizesClone 数组* 中,但不在 sizes 数组中,因为我们创建了数组的实际副本,而不是像示例 2 中那样引用数组。

现在,用户清楚地了解了为什么不应在 ES6 中使用赋值运算符,以及为什么应使用 *扩展运算符* 来克隆数组。

更新于:2023年1月19日

浏览量:551

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告