本文已参与「新人创作礼」活动,一起开启掘金创作之路。
最近接到个编辑页面的需求,重置按钮需要实现点击之后恢复表单展示的页面,最开始的思路是:将赋值一个新对象,然后点击重置按钮,让新对象的值替换到老数据。 第一次点击成功实现,测试时发现,第二次就无效了,思考了一下发现,对象是引用数据类型,那么一旦改变,堆内存地址中的数据都会改变,这样就不是固定存储了,只能实现一次重置。 解决方式:因为数据结构简单,使用浅拷贝即可。 浅拷贝代码
var obj = {...obj}
var obj = Object.assign({},obj)
浅谈一下深拷贝
在JS中,数据类型分为基本数据类型和引用数据类型两种,对于基本数据类型来说,它的值直接存储在栈内存中,而对于引用类型来说,它在栈内存中仅仅存储了一个引用,而真正的数据存储在堆内存中。
当我们对数据进行操作的时候,会发生两种情况
基本数据类型
var a = 3;
var b = a;
b = 5;
console.log(a); // 3
console.log(b); // 5
可以看到的是对于基本类型来说,我们将一个基本类型的值赋予 a 变量,接着将 a 的值赋予变量 b ;然后我们修改 b ;可以看到 b 被修改了,而 a 的值没有被修改,两个变量都使用的是独立的数据; 引用数据类型
var obj1 = {
a: 1,
b: 2,
c: 3
}
var obj2 = obj1;
obj2.a = 5;
console.log(obj1.a); // 5
console.log(obj2.a); // 5
可以看到的是,两个对象的值全部被修改了
对象是引用类型的值,对于引用类型来说,我们将 obj1 赋予 obj2 的时候,我们其实仅仅只是将 obj1 存储在栈堆中的的引用赋予了 obj2 ,而两个对象此时指向的是在堆内存中的同一个数据,所以当我们修改任意一个值的时候,修改的都是堆内存中的数据,而不是引用,所以只要修改了,同样引用的对象的值也自然而然的发生了改变