如何在JavaScript中深层复制自定义对象?

Rob*_*015 11 javascript clone object

我一直在这里冲浪一段时间,仍然没有找到适合我的答案.

有没有办法在JS中深层复制非普通对象?

我已经尝试了,jQuery.extend(true, {}, this)但它只克隆了一些,剩下的仍然是另一个对象的参考.

Mic*_*per 12

以下是3种不同的复制对象的方法.每种方法都有利有弊,所以请仔细阅读并选择最适合您情况的方法

Object.assign方法

使用Object.assign,"用于将所有可枚举的自有属性的值从一个或多个源对象复制到目标对象".这会复制值和函数.在撰写本文时,浏览器支持很好,但并不完美,但这是三者中最好的IMO方法.

const obj1 = {a:1, b:2};
const obj1Copy = Object.assign(obj1)
Run Code Online (Sandbox Code Playgroud)

传播算子方法

或者,您可以使用它spread operator从一个对象传播到另一个对象.请记住,这将复制键的值,但如果键的值是内存地址(另一个嵌套对象或数组),那么它只是一个浅拷贝.

const obj1 = {a: () => {}, b:2}
const obj1Copy = { ...obj1 }
Run Code Online (Sandbox Code Playgroud)

JSON字符串化/解析技巧

如果对象没有任何循环引用或函数作为值,则可以使用json stringify技巧:

let myCopy = JSON.parse(JSON.stringify(myObject));
Run Code Online (Sandbox Code Playgroud)

不需要库,并且对大多数对象都很有效.

  • @guest271314 不。但是为什么要在数据结构中添加函数呢?函数必须在不同的地方作为例程。这只是 OOP 失败 )) (2认同)

Fel*_*ino 5

您可以使用lodash的cloneDeep函数 - https://lodash.com/docs/4.16.4#cloneDeep

示例(来自文档)

var objects = [{ 'a': 1 }, { 'b': 2 }];

var deep = _.cloneDeep(objects);
console.log(deep[0] === objects[0]);
// => false
Run Code Online (Sandbox Code Playgroud)