美文网首页
js深拷贝和浅拷贝

js深拷贝和浅拷贝

作者: 小溪流jun | 来源:发表于2021-09-26 08:36 被阅读0次
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>深拷贝和浅拷贝</title>
</head>

<body>
    <script>
        /*
            +深拷贝和浅拷贝
                ==>存储的是该对象在栈中引用,真实的数据存放在堆内存里
                ==>浅拷贝(shallowCopy)只是增加了一个指针指向已存在的内存地址(地址不变)
                ==>深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存(开辟一个新的地址)

                实现深复制的方法
                JSON.parse(JSON.stringify())
        */
        //浅复制
        function shallowCopy(obj) {
            if (typeof obj !== 'object') return

            let newObj = obj instanceof Array ? [] : {}
            for (let key in obj) {
                //对象.hasOwnProperty(key):判断对象是否包含特定的自身(非继承)属性
                if (obj.hasOwnProperty(key)) {
                    newObj[key] = obj[key]
                }
            }
            return newObj
        }

        //简单版的深复制
        function deepClone(obj) {
            if (typeof obj !== 'object') return;
            var newObj = obj instanceof Array ? [] : {};
            for (var key in obj) {
                if (obj.hasOwnProperty(key)) {
                    newObj[key] = typeof obj[key] === 'object' ? deepClone(obj[key]) : obj[key];
                }
            }
            return newObj;
        }

        var obj1 = { a: 1, arr: [2, 3] };
        let obj2 = shallowCopy(obj1)
        console.log(obj1)
        console.log(obj2)
        //改变obj2中的arr,obj1也会改变
        obj2.arr[1] = 5;
        console.log(obj1)
        console.log(obj2)

        //复杂版深克隆:基于简单版的基础上,还考虑了内置对象比如 Date、RegExp 等对象和函数以及解决了循环引用的问题。
        const isObject = (target) => (typeof target === "object" || typeof target === "function") && target !== null;

        function deepClone(target, map = new WeakMap()) {
            if (map.get(target)) {
                return target;
            }
            // 获取当前值的构造函数:获取它的类型
            let constructor = target.constructor;
            // 检测当前对象target是否与正则、日期格式对象匹配
            if (/^(RegExp|Date)$/i.test(constructor.name)) {
                // 创建一个新的特殊对象(正则类/日期类)的实例
                return new constructor(target);
            }
            if (isObject(target)) {
                map.set(target, true);  // 为循环引用的对象做标记
                const cloneTarget = Array.isArray(target) ? [] : {};
                for (let prop in target) {
                    if (target.hasOwnProperty(prop)) {
                        cloneTarget[prop] = deepClone(target[prop], map);
                    }
                }
                return cloneTarget;
            } else {
                return target;
            }
        }
    </script>
</body>

</html>

相关文章

  • JS中的深拷贝与浅拷贝

    知乎:js中的深拷贝和浅拷贝? 掘金: js 深拷贝 vs 浅拷贝 前言 首先深拷贝与浅拷贝只针对 Object,...

  • js浅拷贝深拷贝

    js浅拷贝,深拷贝的简单实现 基础数据 浅拷贝 深拷贝

  • 浅拷贝和深拷贝

    本文参考:JavaScript中的浅拷贝和深拷贝js 深拷贝 vs 浅拷贝深入剖析 JavaScript 的深复制...

  • JS实现深拷贝、instanceof、判断是否为数组

    JS深拷贝 JS中拷贝对象可以按照拷贝的程度可以分为浅拷贝和深拷贝,有些时候我们需要拷贝之后的对象和拷贝之前的对象...

  • JS中对象的复制

    JS中的对象复制分为两种情况:深拷贝和浅拷贝。深拷贝和浅拷贝的区别在于对数组和对象的拷贝,对它们拷贝时浅拷贝只是拷...

  • iOS深拷贝(MutableCopy)与浅拷贝(Copy)的区别

    深拷贝和浅拷贝的概念 iOS中有深拷贝和浅拷贝的概念,那么何为深拷贝何为浅拷贝呢?浅拷贝:浅拷贝并不拷贝对象本身,...

  • 通过jQuery中.extend()方法理解深拷贝

    所谓深拷贝和浅拷贝最大的区别就是js中有简单类型和引用类型的区分,对于简单类型不存在深拷贝和浅拷贝的区分,对于引用...

  • 2020前端高频面试题总结(附答案)

    [ js基础题 ] 1. new的实现原理是什么? 2. 深拷贝和浅拷贝的区别是什么 深拷贝 浅拷贝 3. bin...

  • iOS面试题-第二页

    11.深拷贝和浅拷贝的理解. 深拷贝;拷贝的内容. 浅拷贝:拷贝的指针. 深拷贝如: NSMutableDicti...

  • iOS - copy 与 mutableCopy

    一说到拷贝,就不得不提浅拷贝和深拷贝。 何谓浅拷贝?何谓深拷贝? 往简单的说: 浅拷贝:拷贝地址。 深拷贝:拷贝内...

网友评论

      本文标题:js深拷贝和浅拷贝

      本文链接:https://www.haomeiwen.com/subject/ykxqnltx.html