欢迎来到小居数码网-一家分享数码知识,生活小常识的网站,希望可以帮助到您。

当前位置:生活小常识 > 数码知识 >
优质

js浅拷贝与深拷贝(js的深拷贝)

数码知识

林志衡优秀作者

原创内容 来源:小居数码网 时间:2024-07-29 19:41:01 阅读() 收藏:37 分享:55

导读:您正在阅读的是关于【数码知识】的问题,本文由科普作家协会,生活小能手,著名生活达人等整理监督编写。本文有1198个文字,大小约为5KB,预计阅读时间3分钟。

js深拷贝在讲正题之前我们要先了解数据存储的方式

js的深拷贝

js深拷贝

数据存储方式

在讲之前我们要先知道值类型和引用类型的存储方式。

在JavaScript数据类型中有两种数据类型。

值类型字符串(String)、数字 (Number)、布尔 (Boolean)、空(Null)、未定义(Undefined)、Symbol

。存放在栈内存中的简单数据段,数据大小确定,内存空间大小可以分配。

引用数据类型对象 (Object)数组 (Array)函数 (Function)

存放在堆内存中的对象,在栈内存中存的是一个指针,这个指针指向堆内存一个位置。再从堆内存中取得所需的数据。

存储如下图:

什么是浅/深拷贝

讲完存储的方式,我们来讲讲浅拷贝和深拷贝

拷贝也就是我们常常讲的copy,ctrl+c,ctrl+v,那么我们来看看例子

当我们对分别值类型和引用类型进行赋值。

     var a = 5     var b = a     b += 5     console.log('a=' + a,'b=' + b)     var arr=[1,2,3]     var brr=arr     brr.push(10)     console.log("arr为",arr)     console.log("brr为",brr)

现象:我们发现值类型并没有互相受到影响,然而数组(引用类型)brr数组添加元素的时候改变了arr数组。

解释分析:浅拷贝只会发生在引用类型身上,对于引用类型如果只进行简单的赋值,只会赋值指向堆内存的指针,这种称为浅拷贝。而深拷贝就是完全拷贝一个引用类型,而不是地址指针。

浅拷贝看下面这张原理图:

深拷贝实现

那么我们在赋值引用类型的时候肯定不能出现浅拷贝的现象,对原数据产生影响了。那么就要进行深拷贝

1.通过JSON.stringify和JSON.parse

可以深拷贝的数组和对象,但是不能拷贝函数,可以进行对象或者数组的嵌套拷贝。

缺点:无法实现对对象中方法的深拷贝

使用:

     var brr=JSON.parse(JSON.stringify(arr))

例子:

  var arr = {         name: '浪漫主义码农',         age: 20,         adress: ['jiangxi', 'changsha'],         friends: {             friend1: '张三',             friend2: '李四'         },         function(){             console.log("我是浪漫主义的对象")         }     }     var brr=JSON.parse(JSON.stringify(arr))     brr.name='法外狂徒张三'     brr.adress[0]='长沙'     console.log("arr为", arr)     console.log("brr为", brr)

2.扩展运算符

利用了对象的结构赋值特性方法。

缺点:不对对象里面嵌套的对象进行深拷贝,相当于只是对一层引用对象进行深拷贝

使用:

     var brr={...arr}

例子:

  var arr = {         name: '浪漫主义码农',         age: 20,         adress: ['jiangxi', 'changsha'],         friends: {             friend1: '张三',             friend2: '李四'         },         function(){             console.log("我是浪漫主义的对象")         }     }     var brr={...arr}     brr.name='法外狂徒张三'     brr.adress[0]='长沙'     console.log("arr为", arr)     console.log("brr为", brr)

3.手写递归深拷贝函数

完美解决

函数:

  //使用递归实现深拷贝     function deepClone(obj) {         //判断拷贝的obj是对象还是数组         var objClone = Array.isArray(obj) ? [] : {};         if (obj && typeof obj === "object") { //obj不能为空,并且是对象或者是数组 因为null也是object             for (key in obj) {                 if (obj.hasOwnProperty(key)) {                     if (obj[key] && typeof obj[key] === "object") { //obj里面属性值不为空并且还是对象,进行深度拷贝                         objClone[key] = deepClone(obj[key]); //递归进行深度的拷贝                     } else {                         objClone[key] = obj[key]; //直接拷贝                     }                 }             }         }         return objClone;     }

例子:

      var arr = {         name: '浪漫主义码农',         age: 20,         adress: ['jiangxi', 'changsha'],         friends: {             friend1: '张三',             friend2: '李四'         },         fun: function(){             console.log("我是" + this.name + "的对象")         }     }     var brr = deepClone(arr)     brr.name = '法外狂徒张三'     brr.adress[0] = '长沙'     console.log("arr为", arr)     arr.fun()     console.log("brr为", brr)     brr.fun()      //使用递归实现深拷贝     function deepClone(obj) {         //判断拷贝的obj是对象还是数组         var objClone = Array.isArray(obj) ? [] : {};         if (obj && typeof obj === "object") { //obj不能为空,并且是对象或者是数组 因为null也是object             for (key in obj) {                 if (obj.hasOwnProperty(key)) {                     if (obj[key] && typeof obj[key] === "object") { //obj里面属性值不为空并且还是对象,进行深度拷贝                         objClone[key] = deepClone(obj[key]); //递归进行深度的拷贝                     } else {                         objClone[key] = obj[key]; //直接拷贝                     }                 }             }         }         return objClone;     }

上面就是小居数码小编今天给大家介绍的关于(js的深拷贝)的全部内容,希望可以帮助到你,想了解更多关于数码知识的问题,欢迎关注我们,并收藏,转发,分享。

94%的朋友还想知道的:

(229)个朋友认为回复得到帮助。

部分文章信息来源于以及网友投稿,转载请说明出处。

本文标题:js浅拷贝与深拷贝(js的深拷贝):http://sjzlt.cn/shuma/152730.html

猜你喜欢