复制JS对象是很常见的操作,但是需要注意的是,在JS中,对象是引用类型,因此直接复制对象会导致对象引用被复制,而不是对象本身。这里介绍几种复制JS对象的方法,包括深拷贝和浅拷贝。
浅拷贝
浅拷贝可以简单地理解为将对象的属性复制一份到新的对象中,但是属性值为对象的属性仍然是引用关系。
表达式“{...obj}”
ES6中引入了表达式“{...obj}”,可以用于浅拷贝对象。具体方法如下:
const obj = {a: 1, b: {c: 2}};
const newObj = {...obj};
obj.b.c = 3;
console.log(newObj.b.c); // 输出3
示例中,首先创建了一个对象obj,其中包含属性a和一个嵌套的对象b。然后使用表达式“{...obj}”对对象进行浅拷贝,将其复制到新的对象newObj中。最后,修改obj.b.c的值为3,并打印newObj.b.c的值,发现其也变为了3。这是因为在浅拷贝中,属性b的值仍然是原对象中对象b的引用,因此修改原对象中对象b的属性值,会同时影响新对象的属性值。
Object.assign方法
除了使用表达式“{...obj}”进行浅拷贝,还可以使用Object.assign方法进行拷贝。具体方法如下:
const obj = {a: 1, b: {c: 2}};
const newObj = Object.assign({}, obj);
obj.b.c = 3;
console.log(newObj.b.c); // 输出3
示例中,首先创建对象obj,并将其浅拷贝到newObj中,然后修改obj.b.c的值为3,并输出newObj.b.c,发现其也变为了3。由于Object.assign只拷贝对象自身的属性,而不拷贝原型链上的属性和方法,因此可以确保拷贝出的属性是新的对象的自有属性。
深拷贝
深拷贝可以理解为将对象本身以及其属性的值都复制到新的对象中。由于对象的属性可能是对象或数组等引用类型,因此需要使用递归的方式复制对象属性。
JSON.parse(JSON.stringify(obj))
在JS中可以使用JSON.parse(JSON.stringify(obj))进行深拷贝。具体方法如下:
const obj = {a: 1, b: {c: 2}};
const newObj = JSON.parse(JSON.stringify(obj));
obj.b.c = 3;
console.log(newObj.b.c); // 输出2
示例中,首先创建对象obj,并使用JSON.parse(JSON.stringify(obj))进行深拷贝,拷贝结果保存在newObj中。然后修改obj.b.c的值为3,并输出newObj.b.c,发现其仍然是2。这是因为采用JSON.parse(JSON.stringify())进行深拷贝时,会先将对象序列化成JSON格式的字符串,然后再将其解析成新的对象。由于字符串是值类型,因此在解析时会创建新的对象,从而实现了深拷贝。
需要注意的是,采用JSON.parse(JSON.stringify())深拷贝对象时,不能拷贝函数和undefined值。
Lodash's cloneDeep方法
除了JSON.parse(JSON.stringify()),还可以使用Lodash库提供的cloneDeep方法进行深拷贝。具体方法如下:
const _ = require('lodash');
const obj = {a: 1, b: {c: 2}};
const newObj = _.cloneDeep(obj);
obj.b.c = 3;
console.log(newObj.b.c); // 输出2
示例中,首先使用require导入Lodash库,并使用_.cloneDeep()方法进行深拷贝。然后修改原对象obj的属性值,并输出newObj.b.c,发现其仍然是2。lodash的cloneDeep方法可以拷贝对象的所有属性,包括函数和undefined值。
综上所述,深拷贝是将对象及其属性的值都复制到新对象中,而浅拷贝只是复制对象的属性。深拷贝相对比较费时和麻烦,建议仅在必要时使用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:复制js对象方法(详解) - Python技术站