> 地理
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>
本文内容由快快网络小美创作整理编辑!