JS 实现数组和对象的深浅拷贝可以使用不同的方法,下面是几种实现方式及其对应的代码示例。
浅拷贝
浅拷贝只是针对对象和数组的一层拷贝,除了基本类型以外,只是复制了一份引用地址。原始数据和拷贝数据共享同一片内存,也就是说,对其中一个进行修改,就会影响到另外一个。实现浅拷贝的方法主要有 Object.assign() 和 Array.prototype.concat()。
方法一:Object.assign()
Object.assign() 可以把一个或多个源对象的所有可枚举属性复制到一个目标对象中。它的用法是 Object.assign(target, ...source),其中 target 是目标对象,source 是一个或多个源对象。
语法示例:
let obj1 = { a: 1 };
let obj2 = { b: 2 };
let obj = Object.assign({}, obj1, obj2);
console.log(obj); // { a: 1, b: 2 }
方法二:Array.prototype.concat()
Array.prototype.concat() 可以用于合并两个或多个数组。它的用法是 array.concat(value1, value2, ..., valueX),其中 value1, value2, ..., valueX 是要连接的一个或多个数组或者非数组值。
语法示例:
let arr1 = [1];
let arr2 = [2];
let arr = arr1.concat(arr2);
console.log(arr); // [1, 2]
深拷贝
相比于浅拷贝,深拷贝可以将目标对象的属性递归地复制到一个新的对象或数组中,从而实现真正的拷贝,两个数据之间没有任何关联。但在实际开发中,深拷贝无疑更加消耗性能。实现深拷贝的方法主要有 JSON.parse(JSON.stringify()) 和递归方法。
方法一:JSON.parse(JSON.stringify())
在 JavaScript 中,可以使用 JSON.stringify() 方法将一个对象转换成一个 JSON 字符串,然后使用 JSON.parse() 方法将这个 JSON 字符串转换成一个新的对象,从而实现深拷贝。
语法示例:
let obj = { name: 'Bob', age: 18, hobby: ['reading', 'running'] };
let newObj = JSON.parse(JSON.stringify(obj));
console.log(newObj); // { name: 'Bob', age: 18, hobby: ['reading', 'running'] }
但这种方法有一些限制,它不能拷贝 undefined、function、Symbol 等特殊数据类型,也不能拷贝循环引用的数据结构。
方法二:递归方法
递归方法是另一种实现深拷贝的方式。它通过递归遍历每一个属性,将属性逐个复制到新的对象中。在递归过程中,需要判断属性的类型,如果是对象或数组,则继续递归复制,如果是基本数据类型,则直接赋值即可。
语法示例:
function deepClone(obj) {
let newObj = obj instanceof Array ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
if (typeof obj[key] === 'object') {
newObj[key] = deepClone(obj[key]);
} else {
newObj[key] = obj[key];
}
}
}
return newObj;
}
let obj = { name: 'Bob', age: 18, hobby: ['reading', 'running'] };
let newObj = deepClone(obj);
console.log(newObj); // { name: 'Bob', age: 18, hobby: ['reading', 'running'] }
以上就是 JS 实现数组和对象的深浅拷贝的完整攻略,希望对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js实现数组和对象的深浅拷贝 - Python技术站