JavaScript 中的拷贝分为两种:浅拷贝和深拷贝。

浅拷贝是指在拷贝过程中,只拷贝一个对象中的指针,而不拷贝实际的数据。所以,浅拷贝中修改新对象中的数据时,原对象中的数据也会被改变。

JavaScript 中浅拷贝可以通过如下几种方式实现:

  • 使用结构赋值的方式,例如 let newObject = {...oldObject}
  • 使用 Object.assign() 方法,例如 let newObject = Object.assign({}, oldObject)

深拷贝是指在拷贝过程中,拷贝一个对象中的所有数据,并创建一个新对象,对新对象进行操作并不会影响到原对象。

JavaScript 中深拷贝可以通过如下几种方式实现:

  • 使用 JSON.parse(JSON.stringify(object))
  • 使用递归的方式,手动拷贝对象的每一层
  • 使用lodash类库的_.cloneDeep方法

另外在特定的场景中,如果对象中存在函数或循环引用,上述方法可能会出现问题。为了解决这些问题,可以使用第三方库如lodash等来实现深拷贝。

此外, 如果你需要深拷贝自定义的对象,需要实现一个深度遍历的函数来遍历对象中的每一层,并进行拷贝。还有,如果对象中有对其他对象的引用或者包含 Symbol 属性的对象,那么上述深拷贝的方式也可能会失效,需要使用更加高级的方式来实现深拷贝。

总的来说,在使用浅拷贝和深拷贝时,需要根据需求和对象的结构来进行选择。通常来说,如果需要对对象进行修改并且不希望对原对象造成影响,那么应该使用深拷贝。如果只是需要读取对象中的数据而不需要修改,那么可以使用浅拷贝。

需要注意的是,JavaScript中的拷贝是拷贝的引用,而不是值。当你修改拷贝出来的对象的属性的值的时候,原对象的属性也会被修改,所以在进行深拷贝时,需要注意循环引用的问题, 防止栈溢出.