手写深浅拷贝
参考
来源:https://www.bilibili.com/video/BV1sN411974w?p=2
细讲:JavaScript 数据类型和数据结构 - JavaScript | MDN (mozilla.org)
(11条消息) JavaScript数据类型的存储方法详解_Bminem的博客-CSDN博客
(11条消息) 精致的js深浅拷贝(面试题有关)_轻叹年华逝,的博客-CSDN博客_js深浅拷贝面试
前端面试题——对象的深浅拷贝 - 知乎 (zhihu.com)
JavaScript 深拷贝(deep copy)和浅拷贝(shallow copy) - 隙游尘 - 博客园 (cnblogs.com)
1. 知识
数据类型
- 7 种原始类型,使用typeof运算符检查:
- Object:typeof instance === "object"。任何 constructed 对象实例的特殊非数据结构类型,也用做数据结构:new Object,new Array,new Map,new Set,new WeakMap,new WeakSet,new Date,和几乎所有通过 new keyword 创建的东西。
		如果我们希望检查任何从 Object 派生出来的结构类型,使用 typeof 是不起作用的,因为总是会得到 "object"。检查 Object 种类的合适方式是使用 instanceof 关键字。但即使这样也存在误差。
引用数据类型
基础数据类型存在栈中,而引用数据类型存在堆中
赋值
对引用数据类型,赋值是单纯的引用
浅拷贝(引用数据类型之间的直接赋值即可实现)
对引用数据类型,浅拷贝前后会互相影响(拷贝的是内存的地址)
深拷贝(slice、concat、Array.from)
对引用数据类型,深拷贝会建立新的堆
拓展运算符、Object.assign()
为浅拷贝
深拷贝的方法
- JSON.parse(JSON.stringify())
 缺点是:不能拷贝函数
- 引lodash库里的deepclone

2. 手写
// 浅拷贝
 var easyCopy = function ( extendObj ) {
        var newObj = extendObj.constructor === Array ? [] : {};
        if (typeof extendObj != 'object') return;
        for (var key in extendObj) {
            if (extendObj.hasOwnProperty(key)) {
                newObj[key] = extendObj[key];
            }
        }
        return newObj
    };
    var obj2 = {
        tall: 1.8,
        weight: 75
    }
    var obj1 = easyCopy( obj2 );
    console.log( obj1 );
// 深拷贝
// 丐版
var newObj = JSON.parse( JSON.stringify( someObj ) );
// 递归经典实现
function deepCopy(obj){
    //判断是否是简单数据类型,
    if(typeof obj == "object"){
        //复杂数据类型
        var result = obj.constructor == Array ? [] : {};
        for(let i in obj){
            result[i] = typeof obj[i] == "object" ? deepCopy(obj[i]) : obj[i];
        }
    }else {
        //简单数据类型 直接 == 赋值
        var result = obj;
    }
    return result;
}	
本文来自博客园,作者:沧浪浊兮,转载请注明原文链接:https://www.cnblogs.com/shixiu/p/15995300.html
 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号