[前端面试题]:深拷贝与浅拷贝的区别
1.什么是深拷贝与浅拷贝
浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,
拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址 ,所以如果其中一个对象改
变了这个地址,就会影响到另一个对象。
深拷贝是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修
改新对象不会影响原对象。
2.深拷贝与浅拷贝的区别
浅拷贝:重新在堆中创建内存,拷贝前后对象的基本数据类型互不影响,但拷贝前后对象的引用类
型因共享同一块内存,会相互影响。
深拷贝:从堆内存中开辟一个新的区域存放新对象,对对象中的子对象进行递归拷贝,拷贝前后的两
个对象互不影响。
浅拷贝只复制一层对象的属性,而深拷贝则递归复制了所有层级。
3.深拷贝与浅拷贝的实现方式
1.浅拷贝的实现方式:
1.Array.concat( )
2.Array.slice( )
3.Object.assign( )
Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对
象。
语法:Object.assign(target, source1, source2)
target:目标对象
source:源对象
4.展开运算符
2.深拷贝的实现方式
1.JSON.parse(JSON.stringify())
2.jQuery.extend( )
语法:$.extend( [deep ], target, object1 [, objectN ] )
deep:Boolean类型,指示是否深度合并对象,默认为false。如果该值为true,且多个对象的某个
同名属性也都是对象,则该"属性对象"的属性也将进行合并。
4.深拷贝与浅拷贝的应用场景
- 无论是浅拷贝还是深拷贝,一般都用于操作Object 或 Array之类的复合类型。
- 对于一层结构的Array和Object想要拷贝一个副本时使用,使用浅拷贝
- 对于想对某个数组或对象的值进行修改,但是又要保留原来数组或对象的值不被修改,此时就可以用深拷贝来创建一个新的数组或对象,从而达到操作(修改)新的数组或对象时,保留原来数组或对象。