深浅拷贝的理解
admin
2024-04-25 05:34:29
0

js中数据类型分为:

基本数据类型:Number,String,Boolean,Null,Undefined,Symbol

对象数据类型(引用数据类型):Object

引用数据类型的值是保存在栈内存和堆内存中的对象.栈区内存内存保存变量标识符和指向堆内存中该对象的指针.当寻找引用值时,解释器会先寻找栈中的地址.然后根据地址找到堆内存的实体.

浅拷贝

浅拷贝会将对象的每个属性进行依次复制,但是当对象的属性值是引用类型时,实质复制的是其引用,当引用指向的值改变时也会跟着变化.

深拷贝

深拷贝和浅拷贝是针对复杂数据类型来说的,浅拷贝只拷贝一层,而深拷贝是层层拷贝.

深拷贝复制变量值,对于非基本类型的变量,则递归至基本类型变量后,再复制.深拷贝后的对象与原来的对象是完全隔离的,互补影响,对一个对象的修改并不会影响另一个对象.

数组(注意:该数组只是单纯的数组,如果数组里面嵌套对象,则下面的几种方法都不是深拷贝)实现深拷贝的几种方法:

1.使用递归的方法.for循环

  let arr1 = [1,2,3];let arr2 = copyArr(arr1);function copyArr(arr){let res=[];for(let i=0,length=arr.length;i

 2.数组的slice方法或者concat方法

 let arr1 = [1,2,3];let arr2 = arr1.slice(0);let arr1 = [1,2,3];let arr2 = arr1.concat();

3.拓展运算符 

 let arr1 = [1,2,3];let [...arr2] = arr1;

 4.Array.from

Array.from()方法就是将一个类数组对象或者可遍历对象转换成一个真正的数组,也是ES6的新增方法。

 let arr1 = [1,2,3];let arr2 = Array.from(arr1);

对象实现深拷贝的几种方法: 

1.for循环

    let obj1={count:1,name:'grace',age:1};let obj2 = copyObj(obj){let res = {};for(let key in obj){res[key]=obj[key];}return res;}

2.使用JSON转换

let obj1={count:1,name:'grace',age:1};
let obj2 = JSON.parse(JSON.stringify(obj1));

3.使用拓展运算符

let obj1={count:1,name:'grace',age:1};
let {...obj2} = obj1;

总结:

浅拷贝针对的是基本数据类型,只改变栈内存.深拷贝针对的是引用数据类型,针对的是堆内存,引用数据类型的栈内存存放的是堆内存的地址.

相关内容

热门资讯

2026年高人气三国演义题材游... 阳谋与阴谋交织,勇武与智略并存——三国时代所承载的战略哲学,在《三国演义》中得以淋漓尽致地呈现。它不...
2026热门幼儿园益智游戏推荐... 当前儿童教育类游戏市场持续升温,面向学龄前儿童的益智启蒙游戏正成为家长关注的重点。这类游戏普遍遵循“...
SOLenchant加速器推荐... SOLenchant凭借独创的神权系统,为玩家带来极具策略深度与操作反馈的战斗体验。然而,由于游戏服...
2026热门亲子游戏推荐:适合... 作为家长,您一定希望孩子在快乐中成长,在互动中进步。为5岁左右的孩子挑选合适的游戏,不仅能激发他们的...
2026年高人气氪金手游推荐:... 步入2026年,游戏产业持续升级迭代,多家头部厂商依托前沿引擎技术与创新设计理念,密集推出题材多元、...
2026热门帝国题材手游推荐:... 在人类文明演进的历史长河中,不同国家都曾历经独特的帝国发展阶段。许多玩家选择通过经典单机策略游戏《帝...
十大手游平台APP推荐 202... 手游平台的选择,直接影响玩家的游戏体验流畅度、安全性与长期使用满意度。当前市场上的第三方应用商店和游...
免费看漫画软件推荐 2024高... 许多漫画爱好者都在寻找无需付费、资源丰富且体验流畅的免费漫画阅读工具。本文精心整理了五款广受用户好评...
直播软件哪个好用 2024高人... 当前市面上直播类应用种类繁多,用户在选择时往往面临功能定位不清、体验差异大等问题。本文聚焦于兼具社交...
罗马之城游戏发售价格及全平台上... 这款以古罗马为背景的城市建造模拟游戏,凭借超高清的视觉表现与严谨的历史考据,精准复刻了公元前一世纪至...