JS 深拷贝的三种实现方式


本文摘自PHP中文网,作者Guanhui,侵删。

JS 深拷贝的三种实现方式

1、将对象转换为JSON字符串形式,再将其转换为原生JS对象;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

//_tmp和result是相互独立的,没有任何联系,有各自的存储空间。

let deepClone = function (obj) {

    let _tmp = JSON.stringify(obj);//将对象转换为json字符串形式

    let result = JSON.parse(_tmp);//将转换而来的字符串转换为原生js对象

    return result;

};

 

let obj1 = {

    weiqiujaun: {

        age: 20,

        class: 1502

    },

    liuxiaotian: {

        age: 21,

        class: 1501

    }

};

 

let test = deepClone(obj1);

console.log(test);

2、使用JS中的for循环实现遍历和复制;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

function deepClone(obj) {

    let result = typeof  obj.splice === "function" ? [] : {};

    if (obj && typeof obj === 'object') {

        for (let key in obj) {

            if (obj[key] && typeof obj[key] === 'object') {

                result[key] = deepClone(obj[key]);//如果对象的属性值为object的时候,递归调用deepClone,即在吧某个值对象复制一份到新的对象的对应值中。

            } else {

                result[key] = obj[key];//如果对象的属性值不为object的时候,直接复制参数对象的每一个键值到新的对象对应的键值对中。

            }

 

        }

        return result;

    }

    return obj;

}

 

let testArray = ["a", "b", "c", "d"];

let testRes = deepClone(testArray);

console.log(testRes);

console.log(typeof testRes[1]);

 

let testObj = {

    name: "weiqiujuan",

    sex: "girl",

    age: 22,

    favorite: "play",

    family: {brother: "son", mother: "haha", father: "heihei"}

};

let testRes2 = deepClone(testObj);

testRes2.family.brother = "weibo";

console.log(testRes2);

3、利用数组的“Array.prototype.forEach”方法进行复制即可实现深拷贝。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

let deepClone = function (obj) {

    let copy = Object.create(Object.getPrototypeOf(obj));

    let propNames = Object.getOwnPropertyNames(obj);

    propNames.forEach(function (items) {

        let item = Object.getOwnPropertyDescriptor(obj, items);

        Object.defineProperty(copy, items, item);

 

    });

    return copy;

};

 

let testObj = {

    name: "weiqiujuan",

    sex: "girl",

    age: 22,

    favorite: "play",

    family: {brother: "wei", mother: "haha", father: "heihei"}

}

let testRes2 = deepClone(testObj);

console.log(testRes2);

推荐教程:《JS教程》

以上就是JS 深拷贝的三种实现方式的详细内容,更多文章请关注木庄网络博客

相关阅读 >>

javascript与PHP的区别是什么

html5+javascript进行邮箱地址验证

网站自适应全球语言

html5入门之设计原理解析

html5视频与声频详解

html5中文本框输入去除内容提示

html页面怎么跟PHP文件连接

网页设计css样式代码大全,快来收藏吧!

vue+axios+PHP如何实现上传文件功能?

css中id选择器和class选择器有何不同

更多相关阅读请进入《PHP》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...