一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情。
今天在下班的时候,后台临了临了给发了个bug,一开始只是以为是数据对接错误导致数据不匹配重复同一条数据,后续折腾了好久才发现对同一个对象一直进行操作,导致数据重复。
前奏
在介绍深浅拷贝之前我觉得有必要讲一下数据类型。
Number、String、Boolean、Null、undefined、object、symbol、bigInt。
前五种数据类型为单类型,也是我们常说的基本数据类型,第六种是object,也被称为引用数据类型,他包括了Array,object,function,data 等。
基本数据类型中的数据直接存放在栈内存中。
let a = 1
let b = a
b = 2
console.log(a) 1
console.log(b) 2
在将 a的值赋值给b的时候,由于1,Number属于基本数据类型(单类型)数据只存放在栈内存中,所以 b = a 这样的赋值就属于深拷贝,就是将数据存放的地址也一同赋值,此时更改b中的值与a毫无关系。
那么接下来看看引用类型的赋值。
let arr = [1,2,3]
let arr2 = arr
arr2.splice(1,1)
console.log(arr) [1, 3]
console.log(arr2) [1, 3]
此时你会发现被删除的不止是arr2数组中的第二项,arr数组中的第二项2也被删除了。原因很简单,引用类型在栈中存放的是一个标记,而这个标记指向堆内存中的地址,简单的拷贝只并没有拷贝内存地址,也就是arr和arr2使用的数据存放地址都是同一个,存放的数据也相同,所以在改变arr2的数据的时候,arr的数据也会跟着发生改变。这就属于浅拷贝,只复制了指向地址的指针,并没有赋值数据存放的地址。
那么如何实现引用数据的深拷贝,也就是完全赋值呢,有一些方发,下期在讲。
本人是萌新小白,如果有说的不好的地方,希望大佬多多指正,感谢各位技术大牛。