首页前端开发JavaScriptjavascript 深度copy

javascript 深度copy

时间2023-11-21 13:08:02发布访客分类JavaScript浏览435
导读:JavaScript中的深度复制可以理解为对一个对象的完全拷贝,包括其所有属性和方法。与浅复制不同,深度复制在复制过程中还会将嵌套在对象中的数组、函数、对象等也同时进行复制,以保证新对象与原对象除了引用地址不同外,其他完全一致。以下是一些关...

JavaScript中的深度复制可以理解为对一个对象的完全拷贝,包括其所有属性和方法。与浅复制不同,深度复制在复制过程中还会将嵌套在对象中的数组、函数、对象等也同时进行复制,以保证新对象与原对象除了引用地址不同外,其他完全一致。以下是一些关于如何在JavaScript中实现深度复制的技巧。

首先,最常见的方法是使用JSON.parse()和JSON.stringify()函数进行复制。这种方法非常简洁,实现也相对容易,但需要注意的是,这种方式会忽略掉对象中的function和undefined类型,只保留能被安全序列化的值。例如:

let obj = {
name: 'Alex',scores: [80, 90, 95],sayHello: function() {
    console.log('Hello');
}
}
    let newObj = JSON.parse(JSON.stringify(obj));

此时,newObj虽然也包含了原对象的name和scores属性,但它并没有继承原对象中的sayHello方法。为了解决这个问题,我们需要使用其他方法,比如递归遍历每一个属性并进行复制:

function deepClone(obj) {
    if (obj === null) return obj;
let clone = Object.assign({
}
    , obj);
    Object.keys(clone).forEach(key =>
    (clone[key] = typeof obj[key] === "object" ? deepClone(obj[key]) : obj[key]));
    return Array.isArray(obj) ? (clone.length = obj.length) &
    &
     Array.from(clone) : clone;
}
    let newObj = deepClone(obj);

这个函数在复制对象的每个属性时,判断当前属性是否已经是一个对象,如果是,继续前往下一级递归进行复制。这个过程会一直持续到复制完整个对象。需要注意的是,如果对象中有循环引用的情况,这个函数会进入死循环,导致卡死浏览器。

另外,ES6提供了一种更加简洁的实现方式,使用Spread运算符和递归调用来实现深度复制:

function deepClone(obj) {
let clone = Object.assign({
}
    , obj);
    Object.keys(clone).forEach(key =>
    (clone[key] = typeof obj[key] === "object" ? deepClone(obj[key]) : obj[key]));
    return Array.isArray(obj) ? Object.assign([], clone) : clone;
}
let newObj = {
 ...obj }
    ;

这种方法同样是递归遍历每一个属性并进行复制,但使用的是ES6的语法,更加优雅简洁。需要注意的是,这种方法同样会因为循环引用而导致卡死浏览器。另外,这种方法还支持Spread语法进行浅复制,如下:

let obj = {
 name: 'Alex', age: 25 }
    ;
let copyObj = {
 ...obj }
    ;
    

总之,无论是使用JSON.parse()和JSON.stringify()函数,还是手写递归函数,或是ES6的Spread语法,JavaScript中都有多种方法可以实现深度复制。根据使用场景和需要复制的对象类型不同,选择不同的方式可以提高代码效率和可读性。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: javascript 深度copy
本文地址: https://pptw.com/jishu/548953.html
javascript 浏览器 javascript 毕包

游客 回复需填写必要信息