js深浅拷贝

时间:2021-07-12
本文章向大家介绍js深浅拷贝,主要包括js深浅拷贝使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
深拷贝不会修改数组 浅拷贝会修改数组
首先要知道数据的类型
Number,String,null,Undefined,Object,Boolean
分成两大类 :
基本数据类型,引用数据类型
基本数据类型:
Number,String,null,Undefined,Boolean
复杂数据类型:
Object(引用数据类型)
基本数据类型存储在栈内存里边,引用数据存储在堆内存里边,根本原因是在于保存在栈内存的必须是大小固定的数据,引用类型的大小不固定,只能保存在堆内存中,但是可以把他的地址写在栈内存里边供我们访问。
如果是基本数据类型,就按值访问。操作的就是变量保存的值,如果是引用类型的值,就通过保存在变量中的引用地址来操作实际对象
 
一、复制:
1.基本数据类型的复制:
 
赋值的时候,在栈内存里边重新开辟内存,存放变量b,所以在栈内存里边分别存放着变量a,b的值,修改时候互补影响
2.引用类型的复制:
 
color1和color2指向的是堆内存中的同一个对象,复制的只是引用地址
 
二、深浅拷贝:
浅拷贝值复制对象的引用地址,而不是复制对象本身,新旧对象还是共享一个引用地址,但是深拷贝会创造一个一模一样的对象,新对象不会和就对象共享内存,修改新对象不会影响旧对象。
1.浅拷贝:
定义:创建一个新对象,这个对象有原始对象的属性值的一份精确拷贝,如果是基本数据的话拷贝的就是它的值,如果数引用数据类型,拷贝的就是它的堆内存的地址,修改一个对象 会影响另一个对象。值是相同的,但是地址也是新开辟的。
浅拷贝的几种方法:
(1)、Object.assign()
对Object。assign而言如果对象的属性值为简单的类型(number,stringify)通过Object.assign()得到的新对象为深拷贝,如果属性值为对象或者其他的引用类型,对这个对象来说就是浅拷贝
Object.assign({},src,src1)对于src src1之间相同的属性是直接覆盖的,如果属性值为对象的话,是不会对 对象之间的属性进行合并的
(2)slice和concat
只有一层的时候是深拷贝
多层的时候:
缺点:数组的slice和concat只是会复制第一层,对于第一层的值都是深拷贝,而到了第二层的时候slice和concat就是复制引用
(3))lodash的clone函数
-.clone(value)
参数:
value(*)要深拷贝的值
返回
(*)返回拷贝后的值
例子:
深拷贝的方法:
(1)递归:
对属性中所有的引用类型的值,遍历到是基本数据为止
(2)JSON对象的parse和stringify
JSON对象中的stringify可以把js对象序列化成一个JSON字符串,parse可以把JSON字符串反序列化成为一个js对象,实现的是深拷贝
缺点:1.使用条件有限制JSON。stringify无法正确转换正则表达式都会转化成{}
2.如果obj里面有时间对象,则JSON.stringify后再JSON.parse的结果,时间将只是字符串的形式,而不是对象的形式
3.如果obj里有函数,undefined,则序列化的结果会把函数或 undefined丢失
4.如果obj里有NaN、Infinity和-Infinity,则序列化的结果会变成null
5.JSON.stringify()只能序列化对象的可枚举的自有属性,例如 如果obj中的对象是有构造函数生成的, 则使用JSON.parse(JSON.stringify(obj))深拷贝后,会丢弃对象的constructor;
(3)lodash的cloneDeep函数
-.cloneDeep(value)
参数:
value(*)要深拷贝的值
返回
(*)返回拷贝后的值
例子:
(4)用的jqery里面的extend方法;
var a = {
name: "zjam",
obj: {
am: "zaofnd",
dvd: "ddddd",
},
};
var b = $.extend(true, {}, a); // 第一个参数true为深拷贝,第二个参数为目标对象,第三个参数为源对象即你用拷贝那个数据
a.obj.am = "早上";
console.log(a);
console.log(b);
缺点:拷贝复杂对象的时候会报错耗性能,内置的拷贝方法会比cloneDeep安全
三、深浅拷贝的主要区别就是:复制的是引用地址还是复制的值
什么时候用深拷贝 /浅拷贝
无论深浅,都是需要的,当深拷贝发生时通常表明存在着一个聚合关系,
当浅拷贝发生时,通常表明存在着相识关系
举个简单例子:当实现一个组合模式 Composite Pattern 时通常都会实
现深拷贝
当实现一个观察者模式 Observer Pattern,时,就需要实现浅拷贝

原文地址:https://www.cnblogs.com/cjq0525/p/15003476.html