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浅拷贝】------【巷子】的更多相关文章

  1. C#设计模式:原型模式(Prototype)及深拷贝、浅拷贝

    原型模式(Prototype) 定义: 原型模式:用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象.被复制的实例被称为原型,这个原型是可定制的. Prototype Pattern也是一 ...

  2. Objective-C中的深拷贝和浅拷贝

    在Objective-C中对象之间的拷贝分为浅拷贝和深拷贝.说白了,对非容器类的浅拷贝就是拷贝对象的地址,对象里面存的内容仍然是一份,没有新的内存被分配.对非容器类的深拷贝就是重写分配一块内存,然后把 ...

  3. $.extend()的深拷贝和浅拷贝详细讲解

    版权声明:作者原创,转载请注明出处! 语法:jQuery.extend( [deep ], target, object1 [, objectN ] ) 描述: 将两个或更多对象的内容合并到第一个对象 ...

  4. JavaScript中面向对象的的深拷贝和浅拷贝

    理解深拷贝和浅拷贝之前需要弄懂一些基础概念,内存中存储的变量类型分为值类型和引用类型. 1.值类型赋值的存储特点, 将变量内的数据全部拷贝一份, 存储给新的变量. 例如:var num = 123 : ...

  5. C++深拷贝与浅拷贝

    当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用.也就是说,当类的对象需要拷贝时,拷贝构造函数将会被调用.以下情况都会调用拷贝构造函数: (1)一个对 ...

  6. C++的深拷贝与浅拷贝

    对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面是一个类对象拷贝的简单例子. #i ...

  7. Python赋值语句与深拷贝、浅拷贝的区别

    参考:http://stackoverflow.com/questions/17246693/what-exactly-is-the-difference-between-shallow-copy-d ...

  8. [C#进阶系列]专题一:深入解析深拷贝和浅拷贝

    一.前言 这个星期参加了一个面试,面试中问到深浅拷贝的区别,然后我就简单了讲述了它们的之间的区别,然后面试官又继续问,如何实现一个深拷贝呢?当时只回答回答了一种方式,就是使用反射,然后面试官提示还可以 ...

  9. 也来玩玩 javascript对象深拷贝,浅拷贝

    经常看到讨论c#深拷贝,浅拷贝的博客,最近js写的比较多, 所以也来玩玩js的对象拷贝. 下面是维基百科对深浅拷贝的解释: 浅拷贝 One method of copying an object is ...

  10. OC中的深拷贝与浅拷贝

    深拷贝(deep copy)与浅拷贝(shallow copy)的定义一直是有争论的. 一种理解是: 所谓的浅拷贝, 就是不完全的拷贝 NSString *s = @"123"; ...

随机推荐

  1. 跑在Docker下的RHEL7编译Java8源码包

    1.运行Docker时需要加参数--cap-add=SYS_PTRACE,比如: docker run --cap-add=SYS_PTRACE --name buildjava8 -v /opt/r ...

  2. sizeof(数组名)和sizeof(指针)

    在做这道题时: 32位环境下,int *p=new int[10];请问sizeof(p)的值为()A.4              B.10              C.40           ...

  3. python + opencv: 解决不能读取视频的问题

    博主一开始使用python2.7和Opencv2.4.10来获取摄像头图像,程序如下: cap = cv2.VideoCapture(0) ret, frame = cap.read() 使用这个程序 ...

  4. 一种是CI(Constructor Injection)构造方法注入,另一种是SI(Set Injection) set 注入

    一:这里先说一下DI(Dependency Injection)依赖注入有种表现形式:一种是CI(Constructor Injection)构造方法注入,另一种是SI(Set Injection) ...

  5. if、for、while、do 等语句自占一行

    if.for.while.do 等语句自占一行,执行语句不得紧跟其后.不论 执行语句有多少都要加{}.这样可以防止书写失误. #include <iostream> /* run this ...

  6. linux -- ubuntu 14.10开机出现错误“Error found when loading /root/.profile”解决

    修改完root权限自动登录后,发现开机出现以下提示: Error found when loading /root/.profile stdin:is not a tty ………… 解决方法:在终端中 ...

  7. perl readlink 函数-返回软链接指向的文件

    readlink 函数专门用于处理链接,可以返回该链接指向的文件的路径 代码示例: print readlink($prog) if (-f $prog && -l $prog):

  8. MVC下载远程文件流(WebClient)

    public ActionResult DownLoad_File() { return File(ScLiu(PathUrl), "application/octet-stream&quo ...

  9. java bigDecimal and double

    Java BigDecimal和double   BigDecimal是Java中用来表示任意精确浮点数运算的类,在BigDecimal中,使用unscaledValue × 10-scale来表示一 ...

  10. Java精选笔记_文件上传与下载

    文件上传与下载 如何实现文件上传 在Web应用中,由于大多数文件的上传都是通过表单的形式提交给服务器的,因此,要想在程序中实现文件上传的功能,首先得创建一个用于提交上传文件的表单页面. 为了使Serv ...