搜索
写经验 领红包
 > 地理

js实现深拷贝的两种方式是什么(js中深拷贝的方法)

导语:js实现深拷贝的两种方式

js实现深拷贝的两种方式是什么(js中深拷贝的方法)

<!DOCTYPE html><html lang=><head>    <meta charset=>    <meta name= content=>    <title>Document</title></head>    <!--     简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,        如果B也跟着变了,说明这是浅拷贝        如果A没变,那就是深拷贝,自食其力。    -->    <script>        // 基本数据类型        // 复制的时候会在栈内存中开辟一个新的内存,包括name和val两部分,所以是独立的,可以实现深拷贝        var c = ;        d = c;        var c = ;        console.log( + c, d);        // 引用数据类型,以数组为例,        // 直接赋值的话是浅拷贝,修改a和b任意一个都会改变另外一个值        // 原理:复制的时候只是赋值a的引用地址,b在栈内存中开辟一个内存,包括name:b和val:引用地址        //      a和b指向堆内存中的同一个地址,也就是指向堆中的同一部分数据。谁该堆中的数据都会影响到另外一个数组。        let a = [0, 1, 2, 3, 4];        b = a;        console.log(a === b);        b[0] = 1;        console.log(a, b);        //想要实现深拷贝,就要让b在复制的时候不只要复制引用地址,还要复制堆里的数据,也就是说在堆和栈中都新开辟出来一块独立的内存        //引用类型数据深拷贝        //方式一:JSON.parse(JSON.stringify()),但是该方法有弊端,对正则表达式类型和函数类型无能为力        let e = [0, 1, 2, 3];        const f = JSON.parse(JSON.stringify(e));        console.log(e, f);        e[0] = 1;        console.log(e, f);        // 方式二:使用递归的方式进行深拷贝        var array = [{            number: 1        }, {            number: 2        }, {            number: 3        }];        var mk =         function copy(obj) {            // 看传进来的是数组还是对象:数组的constructor是array,对象的constructor是object            var newobj = obj.constructor === Array ? [] : {};            // 看传进来的是不是引用类型:数组和对象的type of的值都是object            if (typeof obj !== &39;) {                return;            }            // 备注:使用for in进行遍历的时候,遍历数组的话i代表的下标,遍历对象的话i指的是对象里面的键            for (var i in obj) {                //如果对象的属性值为object的时候,递归调用deepClone,即在吧某个值对象复制一份到新的对象的对应值中。                // 如果对象的属性值不为object的时候, 直接复制参数对象的每一个键值到新的对象对应的键值对中。                newobj[i] = typeof obj[i] === &39; ? copy(obj[i]) : obj[i];            }            return newobj        }        var copyArray = copy(array)        copyArray[0].number = 100;        console.log(array);        console.log(copyArray);    </script>

本文内容由快快网络小美创作整理编辑!