最近在了解浅拷贝和深拷贝然后看了一些博客,下图是我在一个博客看到的浅拷贝…有点无力吐槽这不是赋值吗?
所以有了以下这篇文章 : // 1.浅拷贝只拷贝一层,更深层次的(如对象,数组)级别只拷贝引用地址
// 2.深拷贝拷贝多层
var fn = {
name: "爱保健的坤坤",
arr1: [0, 1, 2, 3],
arr2: [10, 20]
}
var fn1 = {
age: 20,
arr2: [],
length: 18
}
//es5的时候需要用for in遍历 但是es6新增了一个语法糖 Object.assign(得到拷贝结果的对象,被拷贝的对象)ps:我看到过一个风趣的说法形容语法糖(代码少,效率高,老公回家早)
Object.assign(fn1, fn);
console.log(fn, fn1);//从输出的结果对比可以得知浅拷贝会覆盖同名的属性 但是不会影响非同名属性
// fn.name = “cc”
console.log(fn1);//这里可以得到这个结论 浅拷贝修改基本数据类型不会影响另一个的值(之所以讲这个是因为我朋友学习浅拷贝和深拷贝的时候有几个人都陷入了浅拷贝的后续还能对基本数据造成影响的误区)
// fn.arr[0] = 4;
console.log(fn1);
//此时修改fn里面的数组却影响到了fn1里面的数组 浅拷贝修改复杂数据类型的时候会影响另一个的值 因为共用一个指针地址
所以如上图所示fn和fn1都有了操作arr1的权限,
如果是深拷贝的话 那么拷贝的不是指针地址 而是存储空间的内容
//深拷贝和浅拷贝的区别: 深拷贝修改复杂数据类型的时候不会影响另一个的值 (会堆里面的新开辟一个储存空间只是存储的内容是一样的)
最后深拷贝可以的方式太多你们可以自己挑选一种来实现(有一些会有内存泄露的风险),比如1.JQ的clone,2.用JSON.stringify将对象转成JSON字符串,再用JSON.parse() 完成深拷贝 但是注意这种深拷贝对函数有性能问题3.递归实现深拷贝(一道经典的面试题)
(-----我说的不一定对,你可以保持你的想法。----)