定义:

浅克隆: 克隆对象的一层属性, 如果对象还有对象的话,里面的对象没有进行克隆,只是把地址给了别人。也可以理解为只是简单的克隆了躯体,但是没有得到其灵魂;

深克隆:克隆对象的多层属性,对象里面还有对象的话,还会继续拷贝;例如: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深克隆与浅克隆的更多相关文章

  1. Java克隆--深克隆与浅克隆的区别

    克隆,就是复制一个对象的副本,而克隆又分浅克隆和深克隆.浅克隆是指克隆得到的对象基本类型的值改变了,而源对象的值不会变.但如果被克隆对象引用类型的值改变了,那么源对象的值同样会改变,因为引用类型在栈内 ...

  2. 浅谈Java中的深克隆和浅克隆(阿里面试)

    在最近的秋招中,阿里和多益网络都问到了这个问题,虽然很简单,但是我还是想总结一下,感兴趣的可以看一下我的个人博客网站(Spring+MyBatis+redis+nginx+mysql)(适合菜鸟),最 ...

  3. JavaScript的深克隆与浅克隆

    JS数据类型分为两类: 基本类型(Number.Boolean.Undefined.Null.String.Symbol(ES6新加,此处不讨论))与引用类型(Object).原始类型存储的是对象的实 ...

  4. Java中的深克隆和浅克隆

    为什么要克隆 首先思考一个问题, 为什么需要克隆对象? 直接new一个对象不行吗? 克隆的对象可能包含一些已经修改过的属性, 而new出来的对象的属性都还是初始化时候的值, 所以当需要一个新的对象来保 ...

  5. 【java开发系列】—— 深克隆和浅克隆

    Java支持我们对一个对象进行克隆,通常用在装饰模式和原型模式中.那么什么是深克隆,什么是浅克隆呢. [浅克隆],通常只是对克隆的实例进行复制,但里面的其他子对象,都是共用的. [深克隆],克隆的时候 ...

  6. JAVA深克隆与浅克隆1

    复制就是得到一个副本 克隆就是复制一个对象的复本.但一个对象中可能有基本数据类型,如:int,long,float    等,也同时含有非基本数据类型如(数组,集合等)被克隆得到的对象基本类型的值修改 ...

  7. java深克隆与浅克隆

    2015.9.19 6:45   星期五    1

  8. JS如何进行对象的深克隆(深拷贝)?

    JS中,一般的赋值传递的都是对象/数组的引用,并没有真正的深拷贝一个对象,如何进行对象的深拷贝呢? var a = {name : 'miay'}; var b = a; b.name = 'Jone ...

  9. java 深克隆(深拷贝)与浅克隆(拷贝)详解

    java深克隆和浅克隆 基本概念 浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所拷贝的对象,而不复制它所引用的对 ...

随机推荐

  1. MySQL优化篇(未完待续)

    一.优化SQL语句的一般步骤 1.通过 show status命令了解各种sql的执行频率 mysql客户端连接成功后,通过show[session|global] status命令,可以查看服务器的 ...

  2. JavaSE 学习笔记04丨异常

    Chapter 9 异常 异常:指程序在执行过程中,出现的非正常的情况,最终导致JVM非正常停止. 在Java等面向对象的编程语言中,异常是一个类,所有异常都是发生在运行阶段的(因为也只有程序运行阶段 ...

  3. VisualStudio C++使用汇编函数

    Visual Studio编写C++代码使用汇编函数 新建空项目 新建如下源文件 ;test.asm ;测试函数 三个数相加 ;.386 .model flat, c ;public test_ .c ...

  4. vs2019 Com组件初探-简单的COM编写以及实现跨语言调用

    前提条件 1.掌握C++基础语法 2.平台安装 vs2019 3.本地平台为 windows 10 1909 X64 4.了解vbs基础语法 本次目标 1.掌握Com组件的概念及原理 2.编写一个简单 ...

  5. VUE:data数据中,能被网页渲染出来的数据类型有哪些

    我们都知道vue中,data里面的数据类型可以使任意类型. 但是能在网页上可以渲染出来的类型有哪些呢? 我们来看一下在VUE中data里的什么数据类型可以渲染出来. 我在下面列举了这些数据类型 显示结 ...

  6. JZOJ2020年8月11日提高组T4 景点中心

    JZOJ2020年8月11日提高组T4 景点中心 题目 Description 话说宁波市的中小学生在镇海中学参加计算机程序设计比赛,比赛之余,他们在镇海中学的各个景点参观.镇海中学共有n个景点,每个 ...

  7. scentos7安装redis,以及redis的主从配置

    redis的安装 下载redis安装包 wget http://download.redis.io/releases/redis-4.0.6.tar.gz 解压压缩包 tar -zxvf redis- ...

  8. 基础篇:JAVA.Stream函数,优雅的数据流操作

    前言 平时操作集合数据,我们一般都是for或者iterator去遍历,不是很好看.java提供了Stream的概念,它可以让我们把集合数据当做一个个元素在处理,并且提供多线程模式 流的创建 流的各种数 ...

  9. W12Scan和taoman批量刷edusrc(单机)

    昨天看到教育漏洞群里面发了利用w12scan和taoman两个开源工具批量刷edusrc的帖子链接, https://www.bugku.com/thread-3810-1-1.html 跟着帖子上面 ...

  10. jQuery笔记(三)

    day03 - jQuery 学习目标: 能够说出4种常见的注册事件 能够说出 on 绑定事件的优势 能够说出 jQuery 事件委派的优点以及方式 能够说出绑定事件与解绑事件 能够说出 jQuery ...