js 中的 深拷贝与浅拷贝
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 中的 深拷贝与浅拷贝的更多相关文章
- js 中的深拷贝与浅拷贝
		在面试中经常会问到js的深拷贝和浅拷贝,也常常让我们手写,下面我们彻底搞懂js的深拷贝与浅拷贝. 在js中 Array 和 Object 这种引用类型的值,当把一个变量赋值给另一个变量时,这个值得副 ... 
- js中的深拷贝与浅拷贝
		对象的深拷贝于浅拷贝 对于基本类型,浅拷贝过程就是对值的复制,这个过程会开辟出一个新的内存空间,将值复制到新的内存空间.而对于引用类型来书,浅拷贝过程就是对指针的复制,这个过程并没有开辟新的堆内存空间 ... 
- js中的深拷贝和浅拷贝2
		所谓 深浅拷贝: 对于仅仅是复制了引用(地址),换句话说,复制了之后,原来的变量和新的变量指向同一个东西,彼此之间的操作会互相影响,为 浅拷贝. 而如果是在堆中重新分配内存,拥有不同的地址,但是值是一 ... 
- JS中的深拷贝和浅拷贝
		浅拷贝 浅拷贝是拷贝第一层的拷贝 使用Object.assign解决这个问题. let a = { age: 1 } let b = Object.assign({}, a) a.age = 2 co ... 
- JS对象复制(深拷贝、浅拷贝)
		如何在 JS 中复制对象 在本文中,我们将从浅拷贝(shallow copy)和深拷贝(deep copy)两个方面,介绍多种 JS 中复制对象的方法. 在开始之前,有一些基础知识值得一提:Javas ... 
- javascript中的深拷贝与浅拷贝
		javascript中的深拷贝与浅拷贝 基础概念 在了解深拷贝与浅拷贝的时候需要先了解一些基础知识 核心知识点之 堆与栈 栈(stack)为自动分配的内存空间,它由系统自动释放: 堆(heap)则是动 ... 
- 浅谈Java中的深拷贝和浅拷贝(转载)
		浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: ... 
- C语言中的深拷贝和浅拷贝
		//C语言中的深拷贝和浅拷贝 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #inc ... 
- 浅谈Java中的深拷贝和浅拷贝
		转载: 浅谈Java中的深拷贝和浅拷贝 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(bool ... 
随机推荐
- 关于Mysql-unknow-column-in-where-clause
			写在前边: 已经很久不更新了啊,整个2月份几乎没有遇到什么新鲜事.直到昨天我又犯了一次傻,貌似只有我犯傻的时候才有材料可以跟大家分享- 问题表现: mysql 报错: unknow column 's ... 
- 用户登录之asp.net cookie的写入、读取与操作
			页面前面: <div id="login" runat="server"> <span class="log_title" ... 
- C# 读取文件内容
			读取文件内容有三种方式 全部读取到字符串变量中 一次读取一行 全部读取到字符串数组中,每个数组元素存储一行文本 全部读取到字符串变量 string text = System.IO.File.Read ... 
- js Map对象的用法
			第一篇: Map: Map是一组键值对的结构,具有极快的查找速度. 举个例子,假设要根据同学的名字查找对应的成绩,如果用Array实现,需要两个Array: var names = ['Michael ... 
- 【PHP】解决数据库查询出来的中文内容显示为问号“??”
			方法一:在数据库连接后执行: mysql_query('SET NAMES utf8'); 代码: $dbconn=mysql_connect("localhost", " ... 
- web手工项目02-注册功能输入分析,处理,输出方法-测试用例及缺陷编写-首页轮播图和购物车
			web手工项目第二天笔记 昨日回顾 搭建测试环境(WAMP,phpStudy,tpshop项目文件) 熟悉项目(四个步骤,三个来源) 项目测试流程(需求评审,测试计划与方案,测试用例设计与评审,测试执 ... 
- 求数值的n次方根
			二分法 float SqrtByBisection(float n) //用二分法 { if(n<0) //小于0的按照你需要的处理 return n; float mid,last; floa ... 
- 第十章 会话管理——《跟我学Shiro》
			转发地址:https://www.iteye.com/blog/jinnianshilongnian-2028675 目录贴:跟我学Shiro目录贴 Shiro提供了完整的企业级会话管理功能,不依赖于 ... 
- 搭建iOS开发环境
			搭建ios开发环境 1. 直接购买Apple公司的电脑,如MacBook笔记本电脑,默认自带了Mac OS X操作系统. 2.下载安装Xcode和SDK 登录https://develope ... 
- 01.轮播图之二 :tableView 轮播
			在做这个tablevew轮播的时候,重要的就是修改frame 和view 的翻转了:::: 也是不难的,概要的设计和scroll 轮播是一致的: 首先是 .h 的文件 @interface Table ... 
