2021-08-25深拷贝与浅拷贝

深拷贝与浅拷贝的理解

简单来说,深拷贝主要是将另一个对象的属性值拷贝过来之后,另一个对象的属性值并不受到影响,因为此时它自己在堆中开辟了自己的内存区域,不受外界干扰。
浅拷贝主要拷贝的是对象的引用值,当改变对象的值,另一个对象的值也会发生变化。

深拷贝的代码实现

方法一:for循环拷贝直接赋值法
代码实现如下

<script>
function deepCopy(obj1) {
  var obj2 = Array.isArray(obj1) ? [] : {};
  for (let i in obj1) {
  obj2[i] = obj1[i];
 }
  return obj2;
}
var obj1 = {
  a: 1,
  b: 2,
  c: {
  d: 3
 }
}
var obj2 = deepCopy(obj1);
obj2.a = 3;
obj2.c.d = 4;
alert(obj1.a); // 1
alert(obj2.a); // 3
alert(obj1.c.d); // 4
alert(obj2.c.d); // 4
</script>

方法二:Object.assign
代码实现如下

<script>
    const info = {
         name: "kobe",
         age: 18,
         friend: {name: "james"}
    };
    const obj = Object.assign({}, info);
    const obj.friend.name = "lili"
    console.log(obj.name);// kobe
    console.log(obj.friend.name);// lili  这里是浅拷贝
</script>

方法三:es6的扩展运算符"..."
代码实现如下

<script>
var a=[1,2,[3,4]]
 var b=[...a];
 b[0]=5;
 b[2][0]=6
 console.log(b[0]);//5
 console.log(a[0])//1
 console.log(b[2][0]);//6
 console.log(a[2][0])//6
</script>

方法四:JSON.parse和JSON.stringify
代码实现如下:

<script> 
    const info = {name: "kobe", age: 18, friend: {name: "kobe"}};
    const obj = JSON.parse(JSON.stringify(info));
    info.friend.name = "james";
    console.log(obj.friend.name);//james  这里是浅拷贝
    console.log(obj.name);//kobe
</script>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • javascript中的深拷贝和浅拷贝区分以及实现[http://caibaojian.com/javascrip...
    是青水啊阅读 231评论 0 1
  • 我们都知道,JavaScript中有两种数据类型,基本数据类型和引用数据类型。 对于js中的基本数据类型,如num...
    雅木风阅读 840评论 2 2
  • 在 JS 中有一些基本类型像是Number、String、Boolean,而对象就是像这样的东西{ name: '...
    tobAlier阅读 584评论 0 0
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,108评论 0 4
  • 公元:2019年11月28日19时42分农历:二零一九年 十一月 初三日 戌时干支:己亥乙亥己巳甲戌当月节气:立冬...
    石放阅读 6,916评论 0 2