深拷贝与浅拷贝
Posted xwh7
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深拷贝与浅拷贝相关的知识,希望对你有一定的参考价值。
总所周知,传参 或 使用变量给另一个变量赋值时,如果是基本数据类型(null,number,undefined,string,boolean)则是直接复制,但是如果是非基本数据类型(array,function,object等),则是复制对应的引用。
浅拷贝指的是只会复制第一层对象,但是当对象是引用类型时,实质复制的是其引用,当引用指向的值变化时也会随之变化。
深拷贝复制变量值,对于非基本类型的变量,则递归至基本类型变量后,再复制。深拷贝后的对象与原来的对象是完全隔离的,互不影响,对一个对象的修改并不会影响另一个对象。
一般写代码都是用的JSON.parse(JSON.stringify(obj))
实现一个深拷贝:
function deepClone(obj) { //递归拷贝
if(obj === null) return null; //null 的情况
if(obj instanceof RegExp) return new RegExp(obj);
if(obj instanceof Date) return new Date(obj);
if(typeof obj !== ‘object‘) {
//如果不是复杂数据类型,直接返回
return obj;
}
/**
* 如果obj是数组,那么 obj.constructor 是 [Function: Array]
* 如果obj是对象,那么 obj.constructor 是 [Function: Object]
*/
let t = new obj.constructor();
for(let key in obj) {
//如果 obj[key] 是复杂数据类型,递归
t[key] = deepClone(obj[key]);
}
return t;
}
参考: https://github.com/YvetteLau/Blog/issues/7
以上是关于深拷贝与浅拷贝的主要内容,如果未能解决你的问题,请参考以下文章