深拷贝的两种不同实现方式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/DLGDark/article/details/89189532

简介: 在js当中,经常会遇到复制拷贝对象的场景,但是由于对象在内存中的存储于一般普通数据类型值的存储是不一样的,一般值在内存中是直接存在栈当中的,而对象一般在栈中存一个引用(也可以理解为指针),真正的值存储在堆当中,栈中的引用指向堆中对应的值。
所以,在现实中,采用赋值形式的复制方式,会出现问题;如果对象里的某个元素的值依然是一个对象,即多层对象,此时将这个对象复制给一个新对象,后面如果修改新对象里的层级对象里的值,此时会引起源对象里对应值的变化,这样就不是我们想要的效果。故深拷贝旨在解决此问题。(如果不太清楚栈,堆相关知识,可自行百度学习)

  1. 一般方式:
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;
}
  1. 简易方式:
function deepClone (obj) {
	return JSON.parse(JSON.stringify(obj));
}

猜你喜欢

转载自blog.csdn.net/DLGDark/article/details/89189532