深复制浅复制?

作者: 肆意木 | 来源:发表于2017-08-09 14:56 被阅读56次

面试中问到的问题,讲真以前没有注意到这些问题,复制居然还分深复制浅复制,然后查阅文档明白,本质区别是:复制引用和复制实例

下面分别介绍浅复制和深复制,首先讲浅复制:


浅复制是复制引用,复制后的引用都是指向同一个对象的实例,彼此之间的操作会互相影响###

其实我们经常用到的复制都属于浅复制,举栗子:

var test={value:3};
var copTest=test;
copTest.value=7;
console.log(copTest);    //{ value: 7 }
console.log(test);          //{ value: 7 }

可以看到在上面我们复制后的 copyTest 修改值后,最初 test 的值也修改了,我们可以确定 var copTest=test 其实是将 test 对象所指向的地址赋给 copTest ,也就是说这步操作后 test 和 copTest 指向了同一块内存地址,所以我们对 copTest.value 赋值其实等同于对 test.value 进行赋值。所以浅复制可以理解为只复制了一个内存地址。

浅复制的好处就是可以有效的节约内存地址,避免不必要的内存浪费。


深复制就是复制实例,复制后的彼此之间的操作不会互相影响,但是实现深复制的方法可以有很多###

1.

利用 Object.assign 方法实现深复制,assign用于对象的合并,将源对象( source )的所有可枚举属性,复制到目标对象( target ),Object.assign方法的第一个参数是目标对象,后面的参数都是源对象

直接看代码:

let test = {a: 1, b: {c: 2}};
let newTest = Object.assign({}, test);

newTest.a = 2;
newTest.b.c = 3;

console.log(test.a);           //1
console.log(newTest.a);        //2
console.log(test.b.c);         //3
console.log(newTest.b.c);      //3

通过上面的代码我们明白了深复制的意思,说透了就是先分配一个内存地址然后再赋值,但是也注意到了, newTest.b.c=3 并没有实现深复制,这是因为 Object.assign() 方法只能深复制第一层的变量,所以第二层其实是一次浅复制。我们需要对 newTest.b 也用一次Object.assign()才能完成一次完整的深复制。如果 test 里面有很多层,就要循环嵌套使用Object.assign()方法很多次。

2.

JSON对象的parse和stringify

JSON对象parse方法可以将JSON字符串反序列化成JS对象,stringify方法可以将JS对象序列化成JSON字符串,借助这两个方法,也可以实现对象的深复制。

var test1 = {name: "test1", child: {name: "child"}};
var test2 = JSON.parse(JSON.stringify(test1));
//改变target的name属性
test2.name = "test2";
console.log(test1.name); //test1
 console.log(test2.name); //test2
// 改变test2的child
test2.child.name = "test2 child";
console.log(test1.child.name); //child
 console.log(test2.child.name); //test2 child

这样的方法使用比较简单,而且一次性就可以完全实现深复制。

3.

ES7可以利用 … 对对象解构并且对对象中需要深复制的变量进行拷贝。

4 .

改变state需要用到 setState() 方法,setState() 方法就属于深复制。

相关文章

  • Javascript对象的深浅拷贝

    开门见山,有人叫对象的复制为深复制浅复制,也有人叫深拷贝浅拷贝。其实都是copy。 深拷贝(递归复制,复制所有层级...

  • 浅|深 复制

    浅复制 //只写main函数 //结果是 我们可以看到一旦pointArray1发生了改变pointArray2也...

  • JS深浅拷贝

    浅拷贝 浅拷贝的意思就是只复制引用,而未复制真正的值。 深拷贝 深拷贝就是对目标的完全拷贝,不像浅拷贝那样只是复制...

  • 2018-01-06 关于javascript的深拷贝浅拷贝 思

    目录: 什么是复制? 一个简单的浅复制 一个深复制的例子 普遍的深浅复制的几种实现方法 深拷贝,浅拷贝什么是复制?...

  • 17.是否了解 深拷贝 和 浅拷贝 的概念,集合类深拷贝如何实现

    深拷贝内存拷贝 浅拷贝指针拷贝 浅拷贝 深拷贝 集合的浅复制 (shallow copy) 集合的浅复制有非常多种...

  • iOS全解11:特殊问题

    1、浅拷贝和深拷贝的区别? 浅拷贝:只复制指向对象的指针,指针指向同一个地址,而不复制引用对象本身。深拷贝:复制引...

  • java 对象的拷贝

    拷贝:即复制 对象拷贝:即对象复制 java 对象拷贝分类:浅拷贝、深拷贝 java 对象的浅拷贝和深拷贝针对包含...

  • 拷贝与内存管理

    一、关于深拷贝和浅拷贝的总结 理解 本质上我认为区别在于复制是是指针复制(浅拷贝)还是复制到新的地址上(深拷贝) ...

  • 设计模式 - 原型模式

    注意深复制与浅赋值的问题 C#中如果需要实现深复制,必须实现 ICloneable 接口。

  • 浅拷贝与深拷贝

    拷贝 拷贝就拷贝 分什么浅深呀浅拷贝: 我就帮到你复制基本类型跟复制对象的地址 我就只能到这了深拷贝:那要是复制后...

网友评论

    本文标题:深复制浅复制?

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