JavaScript 之深浅拷贝

121 阅读2分钟

1.前言

说到深浅拷贝之前,我们得必须谈到JS的数据类型,数据类型分两种,一种是基础数据类型,一种是引用数据类型。

基础数据类型:String,Number, Boolean, Undefined, Null,Symbol(注:Symbol 是 ES6 引入了一种 新的原始数据类型,表示独一无二的值)
引用数据类型:Function, Object, Array

基础数据类型是保存在栈中的,引用数据类型实际上是保持在堆中的,栈中只是存了一个地址来指向堆。

为什么基础数据类型存储在栈中,而引用类型存储在堆中。

1.基础数据类型比较稳定,占的内存比较小,将它放入空间小,运算速度快的栈中,提高效率。 2.引用数据类型大小是动态的,也是无限的,放在比栈大的堆中是为了不影响栈的效率,通过引用的方式去堆中查找。

对于基础数据类型来说,并没有深浅拷贝之说,深浅拷贝是针对引用数据类型来说的。

2.浅拷贝
浅拷贝只复制引用,而不是复制对象本身。
2.1 赋值
运算符=实现的是浅拷贝,复制的只是对象的引用,指向的是同一个栈中的储存空间,两则是联动的,相互影响,其 中一个改变则另一个也改变。
2.2 JavaScript浅拷贝的四种方法
1、concat,slice, 可以实现对原数组的拷贝,这两个方法都不会修改原数组,而是返回一个新数组。都只是 对数组的第一层进行深拷贝。对象是多层的还是会受影响。
2.Object.assign() ...展开运算符,实现对对象的拷贝。实现的是对象第一层的深拷贝。后面的只是拷贝的引用值。

3.深拷贝 1.JSON.parse(JSON.stringify()),但是此方法在undefinedfunctionsymbol 会在转换过程中被忽略。Map, Set, RegExp, Date, ArrayBuffer,和其他内置类型在进行序列化时会丢失。 2.通过递归循坏

image.png

image.png