【深拷贝VS浅拷贝】------【巷子】
1、回顾
数据传递的方法:
值传递:基本数据类型的数据不会发改变,因为基本数据类型一般存放在栈里面,值传递只是将数据拷贝了一份给另一个变量
引用传递:会改变内存中的数据,因为引用类型的数据都存放在堆里面,栈里面存放的是索引,拷贝的时候是拷贝的地址也就是索引
例如:
值传递
var a = 10;
var b = a;
b+=10;
console.log(a);//
console.log(b);//20;
引用传递
var arr = [10,20,30,40];
var newArr = arr;
newArr[0] = 80;
console.log(arr);//[80,20,30,40]
console.log(newArr);//[80,20,30,40];
因为引用数据类型传递是保存了内存中的地址,当一个数据发生改变的时候 地址里面的数据也会发送改变
2、浅拷贝
浅拷贝:所谓的浅拷贝就是复制一份引用数据类型的地址,当改变了内存中数据的某一个值得话,也会影响到另一个对象 浅拷贝的方式: 浅拷贝1
var obj = {name:"张三",age:19,sex:"男"}
var newObj = obj; newObj.name="李四";
console.log(obj);//{name:"李四",age:19,sex:"男"}
console.log(newObj);//{name:"李四",age:19,sex:"男"} 浅拷贝2
Object.assgin()
参数1:目标对象
参数2:任意多个对象 如果对象是多层的话
var obj = {data:{a:1,b:2,c:3}}; var obj1 = Object.assign({},obj);
obj1.data.a = 10;
console.log(obj);//{data:{a:10,b:2,c:3}} 浅拷贝3
封装CopyAttr()
如果对象是多层的话
function copyAttr(obj){
var newObj = {};
for(var key in obj){
newObj[key] = obj[key];
}
return newObj;
} var obj = {data:{a:1,b:2,c:3}};
var newObj = copyAttr(obj);
newObj.data.a = 10;
console.log(obj)//{data:{a:10,b:2,c:3}} 浅拷贝4
$.extend({},obj)
var obj = {data:{a:1,b:2,c:3}};
var newObj = $.extend({},obj);
newObj.data.a = 10;
console.log(obj);//{a: 10, b: 2, c: 3}
console.log(newObj);//{a: 10, b: 2, c: 3}
3、深拷贝
深拷贝:所谓的深拷贝就是复制一份引用数据类型的数据,当改变了数据的某一个值得话,不会影响到另一个对象(注意深拷贝是拷贝的数据,而不是索引,浅拷贝拷贝的是索引而不是数据)
深拷贝1
Object.assign();
如果对象只有一层的
var obj = {a:1,b:2,c:3};
var newObj = Object.assign({},obj);
newObj.a = 10;
console.log(obj);//{a: 1, b: 2, c: 3}
console.log(newObj);//{a: 10, b: 2, c: 3} 深拷贝2
$.extend(true,{},obj)
var obj = {a:1,b:2,c:3};
var newObj = $.extend(true,{},obj);
newObj.a = 10;
console.log(obj);//{a: 1, b: 2, c: 3}
console.log(newObj);//{a: 10, b: 2, c: 3} 深拷贝3
JSON.stringify()
var obj = {data:{a:1,b:2,c:3}};
var newObj = JSON.parse(JSON.stringify(obj));
newObj.data.a = 10;
console.log(obj);//{a: 1, b: 2, c: 3}
console.log(newObj);//{a: 10, b: 2, c: 3}
缺点:没有办法将函数转换为json
【深拷贝VS浅拷贝】------【巷子】的更多相关文章
- C#设计模式:原型模式(Prototype)及深拷贝、浅拷贝
原型模式(Prototype) 定义: 原型模式:用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象.被复制的实例被称为原型,这个原型是可定制的. Prototype Pattern也是一 ...
- Objective-C中的深拷贝和浅拷贝
在Objective-C中对象之间的拷贝分为浅拷贝和深拷贝.说白了,对非容器类的浅拷贝就是拷贝对象的地址,对象里面存的内容仍然是一份,没有新的内存被分配.对非容器类的深拷贝就是重写分配一块内存,然后把 ...
- $.extend()的深拷贝和浅拷贝详细讲解
版权声明:作者原创,转载请注明出处! 语法:jQuery.extend( [deep ], target, object1 [, objectN ] ) 描述: 将两个或更多对象的内容合并到第一个对象 ...
- JavaScript中面向对象的的深拷贝和浅拷贝
理解深拷贝和浅拷贝之前需要弄懂一些基础概念,内存中存储的变量类型分为值类型和引用类型. 1.值类型赋值的存储特点, 将变量内的数据全部拷贝一份, 存储给新的变量. 例如:var num = 123 : ...
- C++深拷贝与浅拷贝
当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用.也就是说,当类的对象需要拷贝时,拷贝构造函数将会被调用.以下情况都会调用拷贝构造函数: (1)一个对 ...
- C++的深拷贝与浅拷贝
对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面是一个类对象拷贝的简单例子. #i ...
- Python赋值语句与深拷贝、浅拷贝的区别
参考:http://stackoverflow.com/questions/17246693/what-exactly-is-the-difference-between-shallow-copy-d ...
- [C#进阶系列]专题一:深入解析深拷贝和浅拷贝
一.前言 这个星期参加了一个面试,面试中问到深浅拷贝的区别,然后我就简单了讲述了它们的之间的区别,然后面试官又继续问,如何实现一个深拷贝呢?当时只回答回答了一种方式,就是使用反射,然后面试官提示还可以 ...
- 也来玩玩 javascript对象深拷贝,浅拷贝
经常看到讨论c#深拷贝,浅拷贝的博客,最近js写的比较多, 所以也来玩玩js的对象拷贝. 下面是维基百科对深浅拷贝的解释: 浅拷贝 One method of copying an object is ...
- OC中的深拷贝与浅拷贝
深拷贝(deep copy)与浅拷贝(shallow copy)的定义一直是有争论的. 一种理解是: 所谓的浅拷贝, 就是不完全的拷贝 NSString *s = @"123"; ...
随机推荐
- AWS SDK for C++调用第三方S3 API
这里介绍AWS SDK for C++ 1.0.x版本,比如下载: https://github.com/aws/aws-sdk-cpp/archive/1.0.164.tar.gz 环境:RHEL/ ...
- Huffman树
结点定义: /* * Huffman树结点定义 */ struct Node { ElementType weight; // 结点的权值 struct Node *leftChild; // 结点的 ...
- perl 字符串比较操作符
perl 中数字和字符串的比较操作符是不一样的 : 其中 == 用于比较数字是否相等:eq 用于比较字符串是否相等: 今天找程序里的bug,结果就是这个操作符用错,哎,赶紧记一下!
- 【Java NIO的深入研究2】RandomAccessFile的使用
RandomAccessFile RandomAccessFile是用来访问那些保存数据记录的文件的,你就可以用seek( )方法来访问记录,并进行读写了.这些记录的大小不必相同:但是其大小和位置必须 ...
- linux上nginx上配置虚拟主机的相关配置
1.配置主配置: nginx/conf/nginx.conf 2.虚拟主机配置:nginx/conf/extra/learn.weixin.com.conf 配置完后,重启服务器!
- ssm框架搭建并演示获取json字符串
为方便起见,使用oracle自带的scott账户中的emp表作为数据源. 预期效果: 1.输入URL:http://localhost:8888/ssm/getEmp?empno=7369 2.返回结 ...
- 经常使用的CSS Hack技术集锦
来源:http://www.ido321.com/938.html 一.什么是CSS Hack? 不同的浏览器对CSS的解析结果是不同的,因此会导致同样的CSS输出的页面效果不同,这就须要CSS Ha ...
- MathType中常遇到的几个问题
每次打开别人的论文,发现公式文字都排版得非常整齐,公式也编辑得非常漂亮,看起来就非常得赏心悦目.再打开自己的论文,一片凌乱,自己不想都再看,公式编辑得乱七八糟,符号不够规范,大小不够统一,你自己都觉得 ...
- Cookie示例
//caozuocookie var webusername = ""; function getCookie(name){ var arr,reg=n ...
- doDBA 监控用法
https://yq.aliyun.com/articles/67051 doDBA tools是什么 doDBA tools是一个基于控制台的远程监控工具,它不需要在本地/远程系统上安装任何软件,它 ...