📅  最后修改于: 2023-12-03 15:08:27.716000             🧑  作者: Mango
在 JavaScript 中,从一个对象创建另一个对象的方式非常普遍。有几种方式可以复制或克隆一个对象,这将在本文中进行介绍。
最简单的方法是使用 "=" 操作符将对象复制给另一个变量。例如:
let obj1 = { a: 1, b: 2, c: 3 };
let obj2 = obj1;
在这种情况下,obj2
只是 obj1
的引用,并不是 obj1
的副本。因此,当你更改 obj1
的值时,obj2
的值也会相应地更改。
如果你想创建一个与原始对象不同但具有相同属性和值的新对象,可以使用浅复制。
一种流行的浅复制方法是使用 Object.assign()
方法。
let obj1 = { a: 1, b: { c: 2 } };
let obj2 = Object.assign({}, obj1);
在 Object.assign()
中,第一个参数是目标对象,后面的每个参数都是源对象。该方法将源对象的属性复制到目标对象中。
在这种情况下,obj2
是 obj1
的浅副本。这意味着,如果原始对象具有嵌套对象,则嵌套对象不会被复制。
展开运算符 (...
) 也可用于浅复制。
let obj1 = { a: 1, b: { c: 2 } };
let obj2 = { ...obj1 };
在这种情况下,obj2
是 obj1
的浅副本。
如果原始对象具有嵌套对象,则浅复制不足够。深复制可以完全复制对象及其嵌套对象。
JSON.parse()
和 JSON.stringify()
可用于深复制。这种方法将对象转换为 JSON 字符串,然后将其转换回新对象。
let obj1 = { a: 1, b: { c: 2 } };
let obj2 = JSON.parse(JSON.stringify(obj1));
在这种情况下,obj2
是 obj1
的深副本。这种方法不支持复制函数或 undefined
值。
Lodash 是一个流行的 JavaScript 工具库,提供了许多有用的函数,其中 cloneDeep()
可用于深复制对象。
const _ = require('lodash');
let obj1 = { a: 1, b: { c: 2 } };
let obj2 = _.cloneDeep(obj1);
在这种情况下,obj2
是 obj1
的深副本。这个方法还支持复制函数或 undefined
值。需要先安装 lodash
。
创建 JavaScript 对象的副本或克隆对象有几种方法,每种方法都有其自己的优缺点。使用浅复制可以非常简单的一次性复制对象的大部分属性,但是如果对象具有嵌套对象,则浅复制就不足够了。使用深复制可以完全复制对象及其嵌套对象。但请注意,如果要复制的对象具有嵌套的循环引用,则深复制可能会失败。
因此,在实际中,根据对象的需求来选择不同的对象复制方法。