vue2        this.form = response.data

       this.oldForm = response.data为啥this.form数据变化会影响this.oldForm里的数据

在 Vue 2 中,当你在组件中看到一个数据属性(例如 this.form 和 this.oldForm)的值发生变化时,这通常是因为 Vue 的响应式系统在背后工作。

当你执行以下代码:

javascript复制代码
 this.form = response.data;  
 
 this.oldForm = response.data;

实际上,你正在将 response.data 的引用分别赋给 this.form 和 this.oldForm。在 JavaScript 中,对象是通过引用传递的,而不是通过值传递的。因此,当你在稍后的某个时刻修改 this.form 时,你实际上是在修改原始对象(即 response.data)。由于 this.oldForm 也指向同一个对象,因此它也会反映这些更改。

要避免这种情况,你可以确保 this.oldForm 存储 response.data 的一个深拷贝,而不是直接引用同一个对象。你可以使用 JSON.parse(JSON.stringify(response.data)) 来创建一个深拷贝:

javascript复制代码
 this.form = response.data;  
 
 this.oldForm = JSON.parse(JSON.stringify(response.data));

这样,即使你修改了 this.formthis.oldForm 仍然会保持其原始值不变。


this.oldForm = JSON.parse(JSON.stringify(response.data)); 和 this.oldForm = Object.assign({}, response.data); 都可以用来复制对象,但它们的工作方式和效率有所不同。

  1. 工作方式:
  • JSON.parse(JSON.stringify(response.data)): 这个方法将对象转换成一个 JSON 字符串,然后再将该字符串转换回一个对象。这意味着它会遍历对象的所有属性,并将它们转换为字符串。然后,它会创建一个新的空对象,并将转换后的字符串属性复制回这个新对象。
  • Object.assign({}, response.data): 这个方法会创建一个新的空对象,并从 response.data 复制所有可枚举的自有属性到这个新对象。与前者相比,它不需要将对象转换为字符串,也不需要序列化和反序列化过程。
  1. 速度:
  • JSON.parse(JSON.stringify(response.data)) 会比 Object.assign({}, response.data) 更慢,因为它涉及到额外的字符串转换和可能的编码/解码开销。
  • Object.assign() 通常更快,因为它直接在内存中操作对象,避免了字符串处理。
  1. 深拷贝 vs 浅拷贝:
  • JSON.parse(JSON.stringify(response.data)) 会创建一个浅拷贝。这意味着如果原始对象的属性值是引用类型(如数组或对象),那么复制的对象的该属性值将是指向原始值的引用。
  • Object.assign({}, response.data) 也会创建浅拷贝,但只会复制自有属性(即直接在源对象上定义的属性)。如果源对象的原型链上有属性,那么这些属性不会被复制。
  1. 适用场景:
  • 如果你需要一个浅拷贝并且不关心性能,那么 JSON.parse(JSON.stringify(...)) 是一个简单的方法。
  • 如果你需要一个快速的浅拷贝或者要确保只复制自有属性,那么 Object.assign() 是一个更好的选择。
  • 如果你需要一个深拷贝,那么你需要使用其他方法或库来实现,因为上述两种方法都只提供浅拷贝。

总结:如果你只关心浅拷贝并且关心性能,那么 Object.assign() 通常会更快。如果你对深拷贝有需求,那么你应该考虑使用其他方法或库。