js在平时的项目中,赋值操作是最多的;比如说:

  var person1 = {
name:"张三",
age:18,
sex:"male",
height:180,
weight:140 }
var person2 = person1;
console.log(person2)
person2.name = "李四";
console.log(person1,person2);

这段代码,console.log 打印出来的结果 person1 和person2的值是一样的。原因就是 person2 person1 都是引用类型;person2的引用地址 和person1的引用地址是一样的;所以改变person2,person1也是跟着person2 一起变化。因为改变的是同一个值。如果不明白的,可以查看https://www.cnblogs.com/lixiuming521125/p/10867062.html

那么问题来了,怎么让 person2 复制 person1的值,并且 person2改变值,不影响 person1 的值???

这里,我们可以重新创建person3,person3是个空对象;person3循环获取person1的值。即:

 var person3 = {}
for(var key in person1){
person3[key] = person1[key]
}
console.log(person3);
person3.name = "王五";
console.log(person3,person1)

这里 person3 的name变成了王五,但是呢 person1的name 还是张三;

这个就是浅拷贝

但是问题又接着出现了;

这个时候,我把person1修改了一下;增加了一个son对象;并且了,我封装了浅拷贝,把他做成了函数:

 function clone(origion,target){
var tar = target?target:{};
for(key in origion){
if(origion.hasOwnProperty(key)){
tar[key] = origion[key];
}
}
return tar;
} Object.prototype.num = 1;
var person1 = {
name:"张三",
age:18,
sex:"male",
height:180,
weight:140,
son:{
first:"lucy",
second:"joy",
third:"Jhonn"
}
} var person4 = clone(person1);
    person4.son.six = "ben"
console.log(person4,person1)

这个时候,person4的son 对象 有了这个 ben,但是 person1 的 son 对象也有。这个就是浅拷贝的一个问题,他只能拷贝 对象 数组的 引用值;

这个时候,可以通过深拷贝来解决这个问题;

 //深拷贝 js原生
function deepClone(origion,target){//origion:原始数据 target:目标数据
var tar = target||{};
for(key in origion){
if(origion.hasOwnProperty(key)){
if(MyTypeOf(origion[key]) == "Array" ){
tar[key] = [];
deepClone(origion[key],tar[key]);
}else if(MyTypeOf(origion[key]) == "Object"){
tar[key] = {};
deepClone(origion[key],tar[key]);
}
tar[key] = origion[key]; }
}
return tar;
}
var person5 = deepClone(person1)
person5.son.fifth = "111111";
console.log(person5,person1)

当然还可以通过 json方式 来实现 深拷贝 JSON.stringify() JSON.parse();

  var person1 = {
name:"张三",
age:18,
sex:"male",
height:180,
weight:140,
son:{
first:"lucy",
second:"joy",
third:"Jhonn"
}
}; var str = JSON.stringify(person1)//把 person1转成字符串
var json = JSON.parse(str)//把字符串转成 json对象,此时的person1 和 json实现了深拷贝

js 中的 深拷贝与浅拷贝的更多相关文章

  1. js 中的深拷贝与浅拷贝

    在面试中经常会问到js的深拷贝和浅拷贝,也常常让我们手写,下面我们彻底搞懂js的深拷贝与浅拷贝. 在js中 Array 和 Object  这种引用类型的值,当把一个变量赋值给另一个变量时,这个值得副 ...

  2. js中的深拷贝与浅拷贝

    对象的深拷贝于浅拷贝 对于基本类型,浅拷贝过程就是对值的复制,这个过程会开辟出一个新的内存空间,将值复制到新的内存空间.而对于引用类型来书,浅拷贝过程就是对指针的复制,这个过程并没有开辟新的堆内存空间 ...

  3. js中的深拷贝和浅拷贝2

    所谓 深浅拷贝: 对于仅仅是复制了引用(地址),换句话说,复制了之后,原来的变量和新的变量指向同一个东西,彼此之间的操作会互相影响,为 浅拷贝. 而如果是在堆中重新分配内存,拥有不同的地址,但是值是一 ...

  4. JS中的深拷贝和浅拷贝

    浅拷贝 浅拷贝是拷贝第一层的拷贝 使用Object.assign解决这个问题. let a = { age: 1 } let b = Object.assign({}, a) a.age = 2 co ...

  5. JS对象复制(深拷贝、浅拷贝)

    如何在 JS 中复制对象 在本文中,我们将从浅拷贝(shallow copy)和深拷贝(deep copy)两个方面,介绍多种 JS 中复制对象的方法. 在开始之前,有一些基础知识值得一提:Javas ...

  6. javascript中的深拷贝与浅拷贝

    javascript中的深拷贝与浅拷贝 基础概念 在了解深拷贝与浅拷贝的时候需要先了解一些基础知识 核心知识点之 堆与栈 栈(stack)为自动分配的内存空间,它由系统自动释放: 堆(heap)则是动 ...

  7. 浅谈Java中的深拷贝和浅拷贝(转载)

    浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: ...

  8. C语言中的深拷贝和浅拷贝

    //C语言中的深拷贝和浅拷贝 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #inc ...

  9. 浅谈Java中的深拷贝和浅拷贝

    转载: 浅谈Java中的深拷贝和浅拷贝 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(bool ...

随机推荐

  1. Webpack中的sourcemap以及如何在生产和开发环境中合理的设置

    一 . 从Sourcemap和Data URL说起 (1)什么是Sourcemap? 我们在打包中,将开发环境中源代码经过压缩,去空格,babel编译转化,最终可以得到适用于生产环境的项目代码,这样处 ...

  2. Python Log Viewer

    https://pythonhosted.org/logview/

  3. unyielding 是否屈服与多线程 勿以恶小而为之 threads are a bad idea

    小结: 1. python的妥协 2. As we know, threads are a bad idea, (for most purposes). Threads make local reas ...

  4. 强大全面的C++框架和库推荐!

    C++ 资源大全 关于 C++ 框架.库和资源的一些汇总列表,内容包括:标准库.Web应用框架.人工智能.数据库.图片处理.机器学习.日志.代码分析等. 标准库 C++标准库,包括了STL容器,算法和 ...

  5. SQL-W3School-总结:SQL 总结

    ylbtech-SQL-W3School-总结:SQL 总结 1.返回顶部 1. SQL 概要 本教程已经向您讲解了用来访问和处理数据库系统的标准计算机语言. 我们已经学习了如何使用 SQL 在数据库 ...

  6. Ionic4.x 创建页面以及页面跳转

    创建页面: 1.cd 到项目目录 2.通过ionic g page 页面名称 3.创建完成组件以后会在 src 目录下面多一个 button 的目录,它既是一个页面也是一个 模块. 4.如果我们想在 ...

  7. Eclipse中把项目导出为war包【我】

    项目右键,Export 全部默认一路下一步,选择一个目标文件夹,确定即可.

  8. Greenwich.SR2版本的Spring Cloud Zuul实例

    网关作为对外服务,在微服务架构中是一个很重要的组件,主要体现在动态路由和接入鉴权这两个功能上.现在我们通过Spring Cloud Zuul来实现对之前a-feign-client(参见Greenwi ...

  9. 【425】堆排序方法(二叉堆)优先队列(PQ)

    参考:漫画:什么是二叉堆? 大根堆 小根堆 参考:漫画:什么是堆排序? 参考:漫画:什么是优先队列? 参考:[video]视频--第14周10--第8章排序10--8.4选择排序3--堆排序2--堆调 ...

  10. laydate时间控件:开始时间,结束时间最大最小值

    时间控件地址及插件下载链接:https://www.layui.com/doc/modules/laydate.html 填充时间已两个功能为例: 1.添加功能 :时间 规则:选择开始时间后,点击结束 ...