最近做一些抽奖活动产品化工具时,遇到了需要不断复用原始数据的场景,修改获取到的数据又不能破坏原始数据的初始化状态。那怎么能使用最少的代码做到了。
引用数据类型的概念
首先我们了解JS的引用数据类型的概念,比如数组Array,它们值的大小是不固定的。引用数据类型的值是保存在堆内存中的对象。JavaScript不允许直接访问堆内存中的位置,因此我们不能直接操作对象的堆内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。因此,引用类型的值都是按引用访问的。这里的引用,我们可以理解为保存在变量对象中的一个地址,该地址与堆内存的实际值相关联。因此当我们要访问堆内存中的引用数据类型时,实际上我们首先是从变量对象中获取了该对象的地址引用(或者地址指针),然后再从堆内存中取得我们需要的数据(来自《这波能反杀》)
接下来我们直接看代码
var obj = {a:1, b:2, c:3} ;
var newObj = JSON.parse(JSON.stringify(Object.assign({}, obj )))
newObj.a = 4;
console.log(newObj.a) // 4
console.log(obj.a) // 1