js深克隆与浅克隆
定义:
浅克隆: 克隆对象的一层属性, 如果对象还有对象的话,里面的对象没有进行克隆,只是把地址给了别人。也可以理解为只是简单的克隆了躯体,但是没有得到其灵魂;
深克隆:克隆对象的多层属性,对象里面还有对象的话,还会继续拷贝;例如:JSON.parse(JSON.stringfy());
还有一种是直接赋值,比浅克隆还要糟糕;躯体都没有复制完整;
区别:
区别 | 基本数据类型 | 复杂数据类型 |
深克隆 | 改变新数据不会影响原数据 | 改变新数据不会影响原数据 |
浅克隆 | 改变新数据不会影响原数据 | 改变新数据会影响原数据 |
赋值 | 改变新数据会影响原数据 | 改变新数据会影响原数据 |
深克隆方法:
JSON.parse(JSON.stringfy( ... ));
只能对单层数据有效,若有多层数据嵌套,里面的数据不能被深拷贝;如:let obj = { name:'sss',age:18,other:{name:'sss2'}};
克隆对象的多层属性;
var dfg = {
house: "洋房",
money: 10000000000000000,
// car: "宝马",
car: {
name: "名爵",
color: "red"
}
}
// 封装以上代码
// 作用:传一个对象,就可以克隆出来一个新对象
function copy(obj){
// 1. 新创建一个对象
var newObj = {};
// 2. 把obj遍历一下,把成员添加给新对象
for(var k in obj){
// console.log(obj[k]); // 对象中的值
// 以下代码的问题:
// 不管obj[k]的值是复杂的还是简单数据类型,都是直接赋值了
// newObj[k] = obj[k];
// 需要进行判断:
// 1. 如果是简单数据类型 ==> 直接赋值
// 2. 如果是复杂数据类型 ==> 先把复杂数据克隆一份呢,把克隆出来的赋值过去
/*if(typeof obj[k] === "object"){
// 复杂数据类型
// var newCar = copy(obj[k]);
// console.log("复杂数据类型", obj[k]);
// console.log(newCar);
// console.log( newCar === obj[k] );
// 把新的对象添加到nnewObj中
newObj[k] = copy(obj[k]);
}else{
// 简单数据类型
newObj[k] = obj[k];
}*/
// 三元简化以上代码
newObj[k] = typeof obj[k] === "object" ? copy(obj[k]) : obj[k];
}
// 3. 返回新对象
return newObj;
}
var dfg2 = copy(dfg);
console.log(dfg2);
js深克隆与浅克隆的更多相关文章
- Java克隆--深克隆与浅克隆的区别
克隆,就是复制一个对象的副本,而克隆又分浅克隆和深克隆.浅克隆是指克隆得到的对象基本类型的值改变了,而源对象的值不会变.但如果被克隆对象引用类型的值改变了,那么源对象的值同样会改变,因为引用类型在栈内 ...
- 浅谈Java中的深克隆和浅克隆(阿里面试)
在最近的秋招中,阿里和多益网络都问到了这个问题,虽然很简单,但是我还是想总结一下,感兴趣的可以看一下我的个人博客网站(Spring+MyBatis+redis+nginx+mysql)(适合菜鸟),最 ...
- JavaScript的深克隆与浅克隆
JS数据类型分为两类: 基本类型(Number.Boolean.Undefined.Null.String.Symbol(ES6新加,此处不讨论))与引用类型(Object).原始类型存储的是对象的实 ...
- Java中的深克隆和浅克隆
为什么要克隆 首先思考一个问题, 为什么需要克隆对象? 直接new一个对象不行吗? 克隆的对象可能包含一些已经修改过的属性, 而new出来的对象的属性都还是初始化时候的值, 所以当需要一个新的对象来保 ...
- 【java开发系列】—— 深克隆和浅克隆
Java支持我们对一个对象进行克隆,通常用在装饰模式和原型模式中.那么什么是深克隆,什么是浅克隆呢. [浅克隆],通常只是对克隆的实例进行复制,但里面的其他子对象,都是共用的. [深克隆],克隆的时候 ...
- JAVA深克隆与浅克隆1
复制就是得到一个副本 克隆就是复制一个对象的复本.但一个对象中可能有基本数据类型,如:int,long,float 等,也同时含有非基本数据类型如(数组,集合等)被克隆得到的对象基本类型的值修改 ...
- java深克隆与浅克隆
2015.9.19 6:45 星期五 1
- JS如何进行对象的深克隆(深拷贝)?
JS中,一般的赋值传递的都是对象/数组的引用,并没有真正的深拷贝一个对象,如何进行对象的深拷贝呢? var a = {name : 'miay'}; var b = a; b.name = 'Jone ...
- java 深克隆(深拷贝)与浅克隆(拷贝)详解
java深克隆和浅克隆 基本概念 浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所拷贝的对象,而不复制它所引用的对 ...
随机推荐
- starUML软件破解
下载链接:http://pan.baidu.com/s/1bpnHJ8F 密码:hk3x 1.使用Editplus或者Notepad++等特殊的文本编辑器打开%StarUML_HOME%/www/ ...
- hashmap(有空可以看看算法这本书中对于这部分的实现,很有道理)
//转载:https://baijiahao.baidu.com/s?id=1618550070727689060&wfr=spider&for=pc 1.为什么用HashMap? H ...
- 337. 打家劫舍 III(树上dp)
在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区.这个地区只有一个入口,我们称之为"根". 除了"根"之外,每栋房子有且只有一个" ...
- Java基础教程——Jshell
Jshell 从java9开始,java提供Jshell工具,可以输入代码片段并马上看到运行结果. 对于简单的Java语句测试,不需要新建文件,编译,运行了 Microsoft Windows [版本 ...
- 03Python网络编程系列之服务端
# 这里边是一个定义了服务端的一系列函数,是Python网络编程这本书第七章的第一个例子.# 这是供后边函数进行调用了,然后我们来进行研究网络的单线程编程,多线程编程.异步网络编程等.# 导入网络编程 ...
- 微信小程序 下拉刷新
<scroll-view class='scroll-view-container' scroll-y="true" bindscrolltolower='scrollToL ...
- 07_ListView
ListView是用来显示一个列表的控件,它在Android源代码中是继承AbsListView类的,AbsListView类是继承于AdapterView类的,而AdapterView类是继承Vie ...
- 偏微分方程数值解法的MATLAB源码
原文出处http://wenku.baidu.com/view/df412e115f0e7cd184253653.html 因为不太喜欢百度文库的格式,所以写到个人博客里面方便使用 <ifram ...
- 第8.12节 Python类中使用__dict__定义实例变量和方法
上节介绍了使用实例的__dict__查看实例的自定义属性,其实还可以直接使用__dict__定义实例变量和实例方法. 一. 使用__dict__定义实例变量 语法: 对象名. dict[属性名] = ...
- 第14.4节 使用IE浏览器获取网站访问的http信息
上节<第14.3节 使用google浏览器获取网站访问的http信息>中介绍了使用Google浏览器怎么获取网站访问的http相关报文信息,本节介绍IE浏览器中怎么获取相关信息.以上节为基 ...