当前位置: 首页 > 科技观察

Javascript中的深拷贝和浅拷贝

时间:2023-03-12 11:39:02 科技观察

数据复制是我们在编程中经常用到的技术。对于普通的数值型数据,复制是很简单的,但是对于对象复制这样的复杂类型,需要考虑的事情有很多,比如我们常说的深拷贝和浅拷贝。浅拷贝复制具有与原始对象关联的属性的对象。事实上,如果一个对象的任何字段被其他对象引用,它们共享相同的内存地址。深拷贝不同于浅拷贝。深拷贝复制对象的所有属性,并为新对象分配新的内存地址。我们对新对象的操作不会影响到原来的对象。看起来原始对象中的所有内容都被复制了。制作另一个副本。数据类型JavaScript中的数据类型分为原始数据类型和复合数据类型。值、字符串、布尔值、undefined和null是原始数据类型,而数组和对象是复合类型。复制和克隆原始数据时,它始终是一个新副本,不会与原始数据关联。当复合数据被浅拷贝时,它只是对赋值的引用。创建深拷贝对于克隆出来的对象,如果我们要进行深拷贝,我们常用的方法是JSON.parse()和JSON.stringify()。ArraysMap、ForEach、Slice对于普通的一维数组,函数Map、ForEach、Slice都提供深拷贝功能,但是对于嵌套数组,这些函数不提供深拷贝功能,用于处理内部数组。总结Object.assign和Object.create都可以复制对象。在使用assign方法时,我们必须保证对象至少复制了第二个参数。通常你只会传递一个空对象作为第一个参数。它不像传播运算符那样提供完整副本。在使用create方法时,以一个已经存在的对象作为新创建对象的原型来创建一个新的对象。现有对象可用作原型,使所有属性都可用于新对象。但就复制而言,它提供了部分深度复制,如赋值和展开运算符。在JavaScript中复制对象的唯一缺陷是嵌套值。