手写深浅拷贝

参考
来源: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运算符检查:
    • undefinedtypeof instance === "undefined"
    • Booleantypeof instance === "boolean"
    • Numbertypeof instance === "number"
    • Stringtypeof instance === "string
    • BigInttypeof instance === "bigint"
    • Symboltypeof instance === "symbol"
    • nulltypeof instance === "object"
  • Objecttypeof 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()

为浅拷贝

深拷贝的方法

  1. JSON.parse(JSON.stringify())
    缺点是:不能拷贝函数
  2. 引lodash库里的deepclone

img

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;
}	

posted @ 2022-03-11 20:39  沧浪浊兮  阅读(53)  评论(0)    收藏  举报