一文弄懂浅拷贝和深拷贝

简介: 一文弄懂浅拷贝和深拷贝

一文弄懂浅拷贝和深拷贝

目的:复制一个对象

浅拷贝:复制基本类型的属性;引用类型的属性复制,复制栈中的变量 和 变量指向堆内存中的对象的指针,不复制堆内存中的对象。(修改拷贝对象中的应用类型属性值时,原对象也会随着变化

深拷贝:复制基本类型的属性;引用类型的属性复制,复制栈中的变量 和 变量指向堆内存中的对象的指针和堆内存中的对象。(修改拷贝对象中的应用类型属性值时,原对象不会随着变化

JS实现

浅拷贝

function clone(origin,target){
    var target = target || {};
    for(var key in origin){
        target[key] = origin[key];//直接赋值每一项
    }
    return target;
}

深拷贝(递归实现)

function deepClone(origin,target){
    var target = target || {},
        toStr = Object.prototype.toString,
        //Object.prototype.toString.call(origin[key]):判断对象类型
        arrType = '[object Array]';//数组类型
    //遍历每一个属性
    for(var key in origin){
        //判断是否是prototype上的属性
        if(origin.hasOwnProperty(key)){
            //不是原型上的
            if(typeof(origin[key]) === 'object' && origin[key] !== null){
                //是引用类型
                if(toStr.call(origin[key]) === arrType){
                    //是数组
                    target[key] = [];
                }else{
                    //是对象
                    target[key] = {};
                }
                //递归拷贝
                deepClone(origin[key],target[key]);
            }else{
                //对应key赋值
                target[key] = origin[key];
            }
        }
    }
    return target;
}
目录
相关文章
|
2月前
|
存储 人工智能 前端开发
深拷贝浅拷贝的区别?如何实现一个深拷贝?
深拷贝浅拷贝的区别?如何实现一个深拷贝?
|
5天前
|
安全 Java
深拷贝和浅拷贝的区别
深拷贝和浅拷贝的区别
|
2月前
|
存储 JSON JavaScript
10分钟深入探讨带你彻底理解浅拷贝与深拷贝
在JavaScript中,对象的拷贝是一项常见的操作。浅拷贝和深拷贝是两种常用的拷贝方式。浅拷贝只复制对象的引用,而深拷贝创建了一个全新的对象,包含与原始对象相同的值和结构。深拷贝和浅拷贝各有适用的场景和注意事项。本文将详细介绍如何实现一个完整而优雅的深拷贝函数,处理循环引用和特殊类型,优化性能,并探讨深拷贝和浅拷贝的应用场景、注意事项和相关属性。
|
2月前
|
存储 Java Apache
【面试问题】深拷贝和浅拷贝的区别?
【1月更文挑战第27天】【面试问题】深拷贝和浅拷贝的区别?
|
12月前
面试官:深拷贝与浅拷贝有啥区别?
面试官:深拷贝与浅拷贝有啥区别?
|
11月前
|
存储 JavaScript 前端开发
深拷贝浅拷贝有什么区别?怎么实现深拷贝?
深拷贝浅拷贝有什么区别?怎么实现深拷贝?
63 0
|
11月前
浅说一下深拷贝和浅拷贝,如何自己实现一个深拷贝?
浅说一下深拷贝和浅拷贝,如何自己实现一个深拷贝?
52 0
|
12月前
|
存储 JSON JavaScript
面试常问:深拷贝和浅拷贝
在了解深拷贝和浅拷贝之前我们先简单了解一下堆和栈的概念。 堆的概念:在javaScript中,堆是用来存储地址的。比如引用数据类型的地址就是存储在堆中。 栈的概念:栈在javascript中用于存储值的。比如基本数据类型都是直接存在栈内存中的。
|
12月前
|
C++
C++学习笔记_06 深拷贝和浅拷贝 2021-04-19
C++学习笔记_06 深拷贝和浅拷贝 2021-04-19
|
存储 JavaScript 数据处理
深浅拷贝问题
深浅拷贝问题
56 0