浅析JavaScript中的浅拷贝和深拷贝
拷贝是什么
在JavaScript中,我们通常把拷贝称之为复制或者克隆,这里的拷贝是指将一个变量的值复制到另一个变量或对象中的过程。但是在拷贝的过程中,存在一种不同的拷贝方式,即浅拷贝和深拷贝。
浅拷贝
浅拷贝(Shallow Copy)是指将一个对象复制到另一个对象中,只是将对象的引用复制了过去,而不是对对象进行拷贝。这种复制方式只是拷贝了对象的基本属性,而不是复制整个对象,因此两个对象仍然共享相同的内存地址。当其中一个对象的值发生改变时,另一个对象的值也会发生改变。
示例:
let obj1 = {
name: 'Tom',
age: 18,
hobbies: ['music', 'reading']
};
let obj2 = Object.assign({}, obj1);
obj2.age = 20;
obj2.hobbies.push('travelling');
console.log(obj1);
console.log(obj2);
在上述示例中,我们使用了Object.assign()方法进行浅拷贝。将obj1的值复制到obj2中,然后修改obj2的值,发现obj1的值未变,但是obj1和obj2的hobbies属性引用的数组是同一个,因此在修改obj2的hobbies属性时,obj1的hobbies属性也会跟着改变。
深拷贝
深拷贝(Deep Copy)是指将一个对象完全复制到另一个对象中,包括对象的引用和值,如果两个对象互相独立,那么其中一个对象的值发生改变时,另一个对象的值不会发生任何改变。
示例:
let obj1 = {
name: 'Tom',
age: 18,
hobbies: ['music', 'reading']
};
let obj2 = JSON.parse(JSON.stringify(obj1));
obj2.age = 20;
obj2.hobbies.push('travelling');
console.log(obj1);
console.log(obj2);
在上述示例中,我们使用了JSON.parse(JSON.stringify())方法进行深拷贝。首先将obj1转换为JSON格式的字符串,再将JSON格式字符串转换为新的对象obj2。由于使用JSON.parse()方法时,会创建一个新的对象,因此obj1和obj2是不同的对象,obj2的修改不会影响obj1的值。
但是需要注意的是,深拷贝也有一些限制。例如,如果对象中存在循环引用或函数等特殊数据类型,深拷贝就无法进行。在这种情况下,我们需要使用其他的实现方法来进行拷贝。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅析javaScript中的浅拷贝和深拷贝 - Python技术站