深拷贝和浅拷贝
栏目: JavaScript · 发布时间: 5年前
内容简介:只有对于Object(复杂数据类型)才有深浅拷贝一说(引用数据类型(Object)的名存在栈内存中,值存在于堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值)$.extend( [ deep ], target, object1 [, objectN ] )
只有对于Object(复杂数据类型)才有深浅拷贝一说
1、粗浅的解释:
- 浅拷贝并不是真的拷贝,新对象仍指向原被拷贝对象的内存地址,如有更新会被同步
(引用数据类型(Object)的名存在栈内存中,值存在于堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值)
- 深拷贝是完全拷贝出了独立的对象,一毛一样
2、怎样实现深拷贝
递归方式
function deepClone(obj){ let objClone = Array.isArray(obj)?[]:{}; // 判断是否为引用类型数据 if(obj && typeof obj==="object"){ for(key in obj){ if(obj.hasOwnProperty(key)){ //判断ojb子元素是否为对象,如果是,递归复制 if(obj[key]&&typeof obj[key] ==="object"){ objClone[key] = deepClone(obj[key]); }else{ //如果不是,简单复制 objClone[key] = obj[key]; } } } } return objClone; } let a=[1,2,3,4], b=deepClone(a); a[0]=2; console.log(a,b); // 2234 1234
extend(jQuery方法)
$.extend( [ deep ], target, object1 [, objectN ] )
deep表示是否深拷贝,为true为深拷贝,为false,则为浅拷贝
let a=[0,1,[2,3],4], b=$.extend(true,[],a); a[0]=1; a[2][0]=1; console.log(a,b);
借用JSON对象的parse和stringify
利用JSON.stringify 将js对象序列化(JSON字符串),再使用JSON.parse来反序列化(还原)js对象;序列化的作用是存储(对象本身存储的只是一个地址映射,如果断电,对象将不复存在,因此需将对象的内容转换成字符串的形式再保存在磁盘上 )和传输(例如 如果请求的Content-Type是 application/x-www-form-urlencoded,则前端这边需要使用qs.stringify(data)来序列化参数再传给后端,否则后端接受不到)
function deepClone(obj){ let _obj = JSON.stringify(obj), objClone = JSON.parse(_obj); return objClone } let a=[0,1,[2,3],4], b=deepClone(a); a[0]=1; a[2][0]=1; console.log(a,b);
使用JSON做深拷贝时,被拷贝对象内如果有date、RegExp或者是function会出现一些问题
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- JavaScript深拷贝、浅拷贝
- javaScript浅拷贝、深拷贝
- Python 浅拷贝与深拷贝
- 浅探JavaScript深拷贝和浅拷贝
- javascript的深拷贝VS浅拷贝
- 深拷贝与浅拷贝深入总结分析
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
C++程序设计原理与实践
(美)Bjarne Stroustrup / 王刚 等 / 机械工业出版社 / 2010.7 / 108.00元
本书是经典程序设计思想与C++开发实践的完美结合,是C++之父回归校园后对C++编程原理和技巧的全新阐述。书中全面地介绍了程序设计基本原理,包括基本概念、设计和编程技术、语言特性以及标准库等,教你学会如何编写具有输入、输出、计算以及简单图形显示等功能的程序。此外,本书通过对C++思想和历史的讨论、对经典实例(如矩阵运算、文本处理、测试以及嵌入式系统程序设计)的展示,以及对C语言的简单描述,为你呈现......一起来看看 《C++程序设计原理与实践》 这本书的介绍吧!