js实现数组、对象深度克隆的两种办法
1.深度克隆的原理
JS中的深度克隆,指的是原对象改变了,克隆出来的新对象也不会改变,原对象与新对象是完全独立的关系。
实现深度克隆的原理得从对象是一种引用类型说起
众所周知,对象是一种引用类型,对象的地址指针存放于栈中,而对象实际的数据存放于堆中。
因此当我们简单地执行复制操作时,实际是把地址指针进行了复制操作,因此在对象的实际数据改变之后,新老对象都会受到影响。
那么如何让他不受到影响呢?
答案是利用基本数据类型的特点,基本类型在执行复制操作后,新老数值之间不会互相产生影响
所以,我们要对对象不断进行分解,直到其是基本数据类型之后,再进行复制操作。
2.实现方法
2.1 硬刚法(迭代法,适用于所有)
// 方法一 利用迭代
// 思路是:判定要克隆的对象是不是引用类型,如果是引用类型,则继续迭代,如果该项是基本类型,则直接复制。
function deepClone(obj){
let newObj=Array.isArray(obj)?[]:{}
if(obj&&typeof obj ==="object"){
for(let key in obj){
if(obj.hasOwnProperty(key)){
newObj[key]=(obj && typeof obj[key]==='object')?deepClone(obj[key]):obj[key];
}
}
}
return newObj
}
let a=[{c:1},2,3,4],
b=deepClone(a);
a[0]={c:2};
console.log(a,b);
2.2 投机取巧法(Json方法,适用于部分)
//方法2 利用JSON对象的方法
//主要是利用JSON.stringify和JSON.parse,这种办法只能实现纯数据的克隆,如果存在function则会直接忽略,不会进行复制操作
function deepClone2(obj){
return JSON.parse(JSON.stringify(obj))
}
let a1={a: 1, b: function() {}}
b1=deepClone2(a1);
console.log(a1,b1);
js实现数组、对象深度克隆的两种办法的更多相关文章
- js对数组对象的操作以及方法的使用
js对数组对象的操作以及方法的使用 如何声明创建一个数组对象: var arr = new Array(); 或者 var arr = []; 如何移除所有数组中数据? arrayJson.dataL ...
- JS去除数组中重复值的四种方法
JS去除数组中重复值的四种方法 1 /// <summary> o[this[i]] = ""; } } newArr.p ...
- php获取数组中重复数据的两种方法
分享下php获取数组中重复数据的两种方法. 1,利用php提供的函数,array_unique和array_diff_assoc来实现 <?php function FetchRepeatMem ...
- JavaScript对象属性访问的两种方式
JavaScript对象属性访问的两种方式 object.attribute object["attribute"] 例如: var employees = [ { "f ...
- js 图片base64转file文件的两种方式
js 图片base64转file文件的两种方式 https://blog.csdn.net/yin13037173186/article/details/83302628 //将base64转换为bl ...
- [转]MFC子线程中更新控件内容的两种办法
一.概述 每个系统中都有线程(至少都有一个主线程),而线程最重要的作用就是并行处理,提高软件的并发率.针对界面来说,还能提高界面的响应能力.一般的,为了应用的稳定性,在数据处理等耗时操作会单独在一个线 ...
- C# HttpClient设置cookies的两种办法
前言:最近公司使用HttpClient对象在发送请求,抛弃了之前的HttpWebRequest,使用httpClient有个好处:就是可以只使用一个HttpClient的实例,去完成发送所有的请求数据 ...
- C# HttpClient设置cookies的两种办法 (转发)
一般有两种办法 第一种handler.UseCookies=true(默认为true),默认的会自己带上cookies,例如 var handler = new HttpClientHandler() ...
- eclipse new server Cannot create a server using the selected type 网上有两种办法,其实原理一样
eclipse new server Cannot create a server using the selected type 网上有两种办法,其实原理一样 第一种说法: 还真的找到解决的方法了, ...
随机推荐
- php 关于文件夹的一些封装好的函数
/** *检测文件名是否合法 * @param string $filename * @return boolean */ function checkFilename($filename){ $pa ...
- JS中JSON对象和JSON字符串的相互转化
转:http://www.cnblogs.com/wbyp/p/7086318.html 一.JSON字符串转换为JSON对象 var str = '{"name":"c ...
- SpringBoot之使用jpa/hibernate
Springboot版本是2.1.3.RELEASE 1.依赖 List-1.1 <dependency> <groupId>org.springframework.boot& ...
- 【BZOJ1046】上升序列(动态规划,贪心)
[BZOJ1046]上升序列(动态规划,贪心) 题面 BZOJ 洛谷 题解 我一开始看错题了,一度以为是字典序最小的序列. 最后发现它要求的字典序是位置的字典序最小. 那就很好办了. 设\(f[i]\ ...
- Git 常用操作(二)
第一次传数据:echo "# miya" >> README.mdgit initgit add README.mdgit commit -m "first ...
- Android Studio 换主题(Material Theme..)
1.去如下网址下载自己喜欢的主题文件xx.jar http://color-themes.com/?view=index 2. 导入方式 下载主题—xxx.jar 注意:如果我们下载下来的jar名字如 ...
- 解题:POI 2004 String
题面 首先我们要有一个明确的构造思路 对于非根节点,我们把子树连上来的线两两配对,这样如果它有奇数个子树就会剩一个,这时候把这根线传给父亲即可.对于根节点还是两两配对,但是注意如果它也有奇数个子树就不 ...
- hiho一下 第197周 逆序单词
1.set #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath&g ...
- Java基础-StringBuffer类与StringBuilder类简介
Java基础-StringBuffer类与StringBuilder类简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.StringBuffer类 在学习过String类之后 ...
- Sitemesh 3使用及配置
1:Sitemesh简介 SiteMesh是一个网页布局和修饰的框架,利用它可以将网页的内容和页面结构分离,以达到页面结构共享的目的. SiteMesh是基于Servlet的filter的,即过滤流. ...