定义:

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

深克隆:克隆对象的多层属性,对象里面还有对象的话,还会继续拷贝;例如: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. docker中启动容器提示端口被占用

    docker中启动容器提示端口被占用,但是 docker ps -a 查不到信息 1.查询端口被占用的id netstat -ntpl |grep 3306 2.杀掉该id kill -9 如果kil ...

  2. 一套标准的ASP.NET Core容器化应用日志收集分析方案

    讲故事 关注我公众号的朋友,应该知道我写了一些云原生应用收集和分析相关的文章,其中内容大多聚焦某个具体的组件: 超级有用的TraceId,快点用起来吧! 如何利用NLog输出结构化日志,并在Kiban ...

  3. native关键字是干什么的?

    目录 1.怎么调用到native方法的呢? 2. java调用自定义native方法步骤 3.使用native的缺点 今天一不小心跟进Object的源码中,发现一个native关键字,一脸蒙蔽,怎么我 ...

  4. k8s+docker_part2

    docker+k8s 目录 docker+k8s 1 简介 1.1 docker是什么 1.2 为什么要用docker 1.2.1 docker容器虚拟化的好处 1.2.2 docker在开发和运维中 ...

  5. cJSON的使用

    1 安装cJSON github地址:https://github.com/DaveGamble/cJSON.git 下载完成后进入cJSON目录,执行下面命令生成Makefile文件 mkdir b ...

  6. 第2.2节 Python的语句

    上节已经介绍了极简的Python代码编写,已经用到了赋值语句,本节对Python的程序语句进行介绍. 一. 常用命令 在介绍Python语句之前,先介绍一下几个有用的Python命令. dir(模块名 ...

  7. 第8.14节 Python类中内置方法__str__详解

    一. object类内置方法__str__和函数str 类的内置方法__str__和内置函数str实际上实现的是同一功能,实际上str调用的就是__str__方法,只是调用方式不同,二者的调用语法如下 ...

  8. PyQt(Python+Qt)学习随笔:Qt Designer中部件的焦点策略focusPolicy设置

    在Qt Designer中可以设置部件的焦点策略,部件的焦点策略属性取值范围由枚举类型Qt.FocusPolicy来定义,该枚举类型及其含义如下表所示: 注意:经老猿测试鼠标轮滚动获取焦点,只有在鼠标 ...

  9. Mybatis学习04

    title: Mybatis学习04 date: 2020-01-20 21:48:00 tags:Mybatis学习的第四篇笔记 这次的笔记主要是mybatis中的注解 <!--more--& ...

  10. 科大讯飞语音合成系统 V5.0绿色便携版

    中文名: 中科大讯飞Interphonic 5.0语音合成系统英文名: Interphonic 5.0版本: 5.0发行时间: 2006年制作发行: 中科大讯飞语言: 简体中文系统简介InterPho ...