深拷贝与浅拷贝

78 阅读2分钟

JavaScript中的拷贝分为深拷贝和浅拷贝两种方式,二者的主要区别如下:

  1. 浅拷贝只是复制了原始对象或数组的第一层属性,如果原始对象或数组内部有嵌套的对象或数组,在浅拷贝后,这些嵌套的对象或数组指向的仍然是原始对象或数组对应位置上的同一个引用。而深拷贝会递归地复制每个嵌套对象或数组,从而创建一份全新的对象或数组,不再与原始对象或数组有任何关联。
  2. 在浅拷贝中,如果对象或数组中某个属性的值是基本类型(如Number、String等),则该值被完整地复制到了新的对象或数组中。但如果属性的值是一个引用类型的话,新的对象或数组并不会创建一个该引用类型的副本而是只保存它的引用,因此,新对象或数组和原始对象或数组会指向同一块内存地址,其中任意一个被更改都会影响到另一个。深拷贝则避免了这个问题,它将会递归复制所有嵌套对象或数组的属性,使得新创建的对象或数组中的任何引用类型属性也指向自己的内存地址。

总之,如果您需要创建一个与原始数组或对象没有任何关联的完全独立的新对象或数组,那么应该使用深拷贝。而如果您只想在原始对象或数组和新对象或数组更改时共享某些引用类型的属性,则可以使用浅拷贝。具体使用哪种方式要根据应用场景来进行选择。