前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一次javascript深拷贝引发的深入思考

一次javascript深拷贝引发的深入思考

作者头像
砖业洋__
发布2023-05-06 20:18:11
920
发布2023-05-06 20:18:11
举报
文章被收录于专栏:博客迁移同步博客迁移同步

A同学和B同学因为一次js深拷贝发生的一次争执。

A同学:深拷贝是另一个对象占用另一块内存就行了,随手写出了如下代码:

代码语言:javascript
复制
let a = {
    name: "lcy",
    age: 18
};
let b = Object.assign({}, a);
console.log(JSON.stringify(b, null, 2));
let c = {};
for (let key in a) {
    c[key] = a[key];
}
console.log(JSON.stringify(c, null, 2));
b.name = "123";
c.name = "456";
console.log(JSON.stringify(a, null, 2));
console.log(JSON.stringify(b, null, 2));
console.log(JSON.stringify(c, null, 2));

B同学:突然一看这两种方法好像确实都是深拷贝,bc对象修改属性后对a对象没什么影响,但是也会面临其他问题,如下

代码语言:javascript
复制
let a = {
    name: "lcy",
    age: 18,
    user: {
        u: "uu_c"
    }
};
let b = Object.assign({}, a);

let c = {};
for (let key in a) {
    c[key] = a[key];
}

b.user.u = "123";
console.log(JSON.stringify(a));
console.log(JSON.stringify(b));
console.log(JSON.stringify(c));
c.user.u = "456";
console.log(JSON.stringify(a));
console.log(JSON.stringify(b));
console.log(JSON.stringify(c));

我们会发现,这种方式如果属性值是对象的话,那么这个对象是浅拷贝的,并么有完全深拷贝。

于是A同学灵机一动,迅速展示思维能力,随手就是一个代码~

代码语言:javascript
复制
let a = {
    name: "lcy",
    age: 18,
    user: {
        u: "uu_c"
    }
};

function deepClone(obj) {
    let res = {};
    for (let key in obj) {
        res[key] = typeof obj[key] == "object" ? 
            deepClone(obj[key]) : obj[key];
    }
    return res;
}

let b = deepClone(a);
console.log(JSON.stringify(a));
console.log(JSON.stringify(b));
b.user.u = "123";
console.log(JSON.stringify(a));
console.log(JSON.stringify(b));

A同学拍拍胸脯,搞定,然后B同学问,万一你这个拷贝的源对象属性是它原型上的呢?我们可能并不需要原型上的属性

A同学:那就在for循环的时候加一个判断,if(obj.hasOwnProperty(key))就行了,其他代码不用动,这个可难不倒我。

B同学:你要不加个数组到a对象试试,如下

代码语言:javascript
复制
let a = {
    name: "lcy",
    age: 18,
    user: {
        u: "uu_c"
    },
    arr: [1, 3, 5]
};

function deepClone(obj) {
    let res = {};
    for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
            res[key] = typeof obj[key] == "object" ? 
                deepClone(obj[key]) : obj[key];
        }
    }
    return res;
}

let b = deepClone(a);
console.log(JSON.stringify(a));
console.log(JSON.stringify(b));

这一下把A同学干懵了,居然数组还有这一情况,typeof 数组类型也是object,看来不能简单的判断object类型,于是A同学深思熟虑之后终于写出了如下代码 

代码语言:javascript
复制
let a = {
    name: "lcy",
    age: 18,
    user: {
        u: "uu_c"
    },
    arr: [1, 3, 5]
};

function deepClone(obj) {
    let res = obj instanceof Array ? [] : {};
    for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
            res[key] = typeof obj[key] == "object" ? 
                deepClone(obj[key]) : obj[key];
        }
    }
    return res;
}

let b = deepClone(a);
console.log(JSON.stringify(a));
console.log(JSON.stringify(b));

最后B同学看了一下,反手一巴掌对着A的后脑勺狠狠地给他点了个赞,说干得漂亮!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-08-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档