📜  如何克隆一个 JavaScript 对象?(1)

📅  最后修改于: 2023-12-03 15:08:27.716000             🧑  作者: Mango

如何克隆一个 JavaScript 对象?

在 JavaScript 中,从一个对象创建另一个对象的方式非常普遍。有几种方式可以复制或克隆一个对象,这将在本文中进行介绍。

直接复制

最简单的方法是使用 "=" 操作符将对象复制给另一个变量。例如:

let obj1 = { a: 1, b: 2, c: 3 };
let obj2 = obj1;

在这种情况下,obj2 只是 obj1 的引用,并不是 obj1 的副本。因此,当你更改 obj1 的值时,obj2 的值也会相应地更改。

浅复制

如果你想创建一个与原始对象不同但具有相同属性和值的新对象,可以使用浅复制。

Object.assign()

一种流行的浅复制方法是使用 Object.assign() 方法。

let obj1 = { a: 1, b: { c: 2 } };
let obj2 = Object.assign({}, obj1);

Object.assign() 中,第一个参数是目标对象,后面的每个参数都是源对象。该方法将源对象的属性复制到目标对象中。

在这种情况下,obj2obj1 的浅副本。这意味着,如果原始对象具有嵌套对象,则嵌套对象不会被复制。

展开运算符

展开运算符 (...) 也可用于浅复制。

let obj1 = { a: 1, b: { c: 2 } };
let obj2 = { ...obj1 };

在这种情况下,obj2obj1 的浅副本。

深复制

如果原始对象具有嵌套对象,则浅复制不足够。深复制可以完全复制对象及其嵌套对象。

JSON.parse() 和 JSON.stringify()

JSON.parse()JSON.stringify() 可用于深复制。这种方法将对象转换为 JSON 字符串,然后将其转换回新对象。

let obj1 = { a: 1, b: { c: 2 } };
let obj2 = JSON.parse(JSON.stringify(obj1));

在这种情况下,obj2obj1 的深副本。这种方法不支持复制函数或 undefined 值。

Lodash.cloneDeep()

Lodash 是一个流行的 JavaScript 工具库,提供了许多有用的函数,其中 cloneDeep() 可用于深复制对象。

const _ = require('lodash');
let obj1 = { a: 1, b: { c: 2 } };
let obj2 = _.cloneDeep(obj1);

在这种情况下,obj2obj1 的深副本。这个方法还支持复制函数或 undefined 值。需要先安装 lodash

结论

创建 JavaScript 对象的副本或克隆对象有几种方法,每种方法都有其自己的优缺点。使用浅复制可以非常简单的一次性复制对象的大部分属性,但是如果对象具有嵌套对象,则浅复制就不足够了。使用深复制可以完全复制对象及其嵌套对象。但请注意,如果要复制的对象具有嵌套的循环引用,则深复制可能会失败。

因此,在实际中,根据对象的需求来选择不同的对象复制方法。