js中的深拷贝和浅拷贝区别
js中的深拷贝和浅拷贝与值传递和引用传递有着些许的关联,都是根据堆栈中数据的储存来传递数据。
下面主要说一下我对深拷贝和浅拷贝的理解:
简单举个例子来说明;当我们声明一个a变量并且赋值,并且让b等于a,因为a,b都是基本数据类型所以数据都是存储在栈中,所以改变其中一个变量的数据他们之间不会相互干扰的,这种拷贝就是深拷贝。而浅拷贝就是改变其中一个变量或者对象等参数的值或者属性,另外一个变量或者对象等参数的值或者属性也会发生变化。
深拷贝
var a=8,b=a;
var b=9;
console.log(a,b); //8,9
堆栈储存过程如下:
或者换一种情况:
var tal = new Object();
function test(obj){obj.name = 'lili';obj.id = 2;
}
test(tal);
tal.name = 'kiki';
console.log(tal); //{name:'kiki',id:2}
当我们创建tal对象的时候:
obj对象在函数中赋值的时候:
当函数调用之后,tal=obj,就是把obj的在栈中的地址付给对象tal,但是他们指向堆中的数据都是一个堆的数据。
改变tal.name的时候:
这样改变对象tal属性的时候就是改变obj对象的属性,这时候就是浅拷贝,无法做到改变tal数据,obj的数据不变。
如果想要深拷贝可以用以下两种方法:
一、用JSON对象的parse和stringify
function test(obj){let _obj = JSON.stringify(obj),objClone = JSON.parse(_obj);return objClone
}
var tal = {name:'lili'};
Cal=test(tal);
Cal.name = 'kiki';
console.log(tal,Cal); //{name: "lili"} {name: "kiki"}
这样就可以实现深拷贝,改变Cal对象的属性而不会改变tal对象的属性。
二、用jquery中的extend
$.extend( [deep ], target, object1 [, objectN ] )
deep表示是否深拷贝,为true为深拷贝,为false,则为浅拷贝
target Object类型 目标对象,其他对象的成员属性将被附加到该对象上。
object1 objectN可选。 Object类型 第一个以及第N个被合并的对象。
var tal = {name:'lili'};Cal=$.extend(true,{},tal);
tal.name='kiki';
console.log(tal,Cal); //{name: "kiki"}{name: "lili"}
这样也可以实现深拷贝,深拷贝的作用一般就是多个人开发一个项目需要使用接口返回的相同数据,但是又不能相互干扰,这时候需要把数据进行深拷贝,从而对拷贝后的数据进行操作,以免影响原始数据。
js中的深拷贝和浅拷贝区别相关推荐
- 详细讲解js中的深拷贝与浅拷贝
1 概述 深拷贝与浅拷贝在其它语言中也经常被提及到,在实际项目开发过程中也常常需要区分当前使用的到底是深拷贝还是浅拷贝,有时候在该使用深拷贝的地方,我们使用了浅拷贝,会导致深藏不露的bug. 2 数据 ...
- 重新梳理下js中的深拷贝和浅拷贝
参考链接: http://www.cnblogs.com/st-les... https://blog.csdn.net/hj7jay/... 浅拷贝: 1.最简单的浅拷贝就赋值. 由于js中的对象都 ...
- JS中的深拷贝与浅拷贝
刚看完JS中的深浅拷贝,来记录分享一番,一起来开心的掉发吧. 首先了解深浅拷贝之前来看看JS中的几种数据类型,分别有String.Number.Boolean.undefined.null.Objec ...
- 理清JS中的深拷贝与浅拷贝
作者:Manjula Dube译者:前端小智来源:Medium 为了保证的可读性,本文采用意译而非直译. 浅拷贝是对象的逐位复制.创建一个新对象,该对象具有原始对象中值的精确副本.如果对象的任何字段是 ...
- js中的extend的用法及其JS中substring与substr的区别
1. JS中substring与substr的区别 之前在项目中用到substring方法,因为C#中也有字符串的截取方法Substring方法,当时也没有多想就误以为这两种方法的使用时一样的. ...
- python怎么避免浅拷贝_详谈Python中的深拷贝和浅拷贝
在平时工作中,经常涉及到数据的传递,在数据传递使用过程中,可能会发生数据被修改的问题.为了防止数据被修改,就需要在传递一个副本,即使副本被修改,也不会影响原数据的使用.为了生成这个副本,就产生了拷贝. ...
- python中的深拷贝与浅拷贝
浅拷贝的时候,修改原来的对象,深拷贝的对象不会发生改变. 对象的赋值 对象的赋值实际上是对象之间的引用:当创建一个对象,然后将这个对象赋值给另外一个变量的时候,python并没有拷贝这个对象,而只是拷 ...
- 面试官:Java深拷贝和浅拷贝区别
文章目录 一.拷贝的引入 (1).引用拷贝 (2).对象拷贝 二.浅拷贝 (1).定义 (2).浅拷贝实例 三.深拷贝 (1).定义 (2).深拷贝实例 一.拷贝的引入 (1).引用拷贝 创建一个指向 ...
- Java 深入理解深拷贝和浅拷贝区别
title: Java 深入理解深拷贝和浅拷贝区别 date: 2021-6-19 updated: 2021-6-19 tags: Java 深拷贝和浅拷贝 categories: 面试 Java ...
最新文章
- java+实现集合并运算_JAVA程序设计报告+集合运算
- java 跨站点脚本编制_AppScan跨站点脚本编制修复
- php设置用户头像,PHP针对多用户实现更换头像功能
- Cmder安装后相关配置说明
- 分享改进 高性能数据同步工具(一)
- 局部临时表 全局临时表 表变量
- 201521123081《Java程序设计》 第4周学习总结
- vue + echarts 省份地图 以及打包后地图加载不出来(比较详细)
- 前端工程师未来发展方向
- 2021-10-07 浊音,清音,爆破音频谱分析
- mysql的month_MySQL MONTH()用法及代码示例
- 秘宝 | 将体育赛事结合区块链 数字藏品新风向
- 打卡记录根据排班表每人每日排班上下班时间自动获取结果打卡记录是属于那是区间
- 爆肝!朋友做了个编程导航网站!
- 关于python 中h5py库安装不上的解决办法
- PLSQL导入Excel遇到的奇怪问题
- Ubuntu 安装nginx
- 国产化之x64平台安装银河麒麟操作系统
- 机器人控制系统学习和研究中数学的重要性
- Pymol 移动配体操作