JS常用复制(拷贝)

1,952 阅读4分钟

前言

在对接口的时候,公司有小伙伴遇到了一个数组数据,要有多个地方用到,并且进行增删改查,然后出现对一个变量进行删除其中的一项的时候,其他列表也出现数据变化。但是实际情况是不需要受到影响,希望每个数组都是独立的。记录一下工作的点滴。

分析

在JS中,数据类型分为基本数据类型和引用数据类型两种,基本数据类型的值存储在栈内存中。而引用类型在栈内存中存储的中仅仅一个'指针(引用地址)',真正的数据存储在这个'指针'指向的堆内存中。

当我们对数据进行复制的时候会遇到2中情况

第一种是基础数据类型的复制

var a = 1;
var b = a;
b = 2;
console.log(a); // 1
console.log(b); // 2

可以看出,把a值赋给b变量时,当b变量的值改变的时候,a变量的值不会受到影响。

第二种是引用数据类型的复制

var obj = {
    a:  1
}
var newObj = obj;
newObj.a = 2;
console.log(obj.a);  // 2
console.log(newObj.a);  // 2

可以看到,把obj值赋给newObj变量时,其实只是把obj在栈内存中的'指针地址'复制给了newObj,此时两个对象都是指向在堆内存中的同一个数据,因此改变的newObj.a 都是修改堆内存中的同一个数据。

上面的第二种复制情况就是浅拷贝,但是在项目中,大多数情况下是不希望多个对象或者变量指向同一个数据,因此对于复制而言更多的应该是引用数据类型的讨论。

常用的深拷贝的方法

1.先JSON.stringify() 将对象转成JSON字符串(基础数据类型),然后用JSON.parse() 将字符串转成JSON对象。

缺点是:无论这个对象原本的构造函数(constructor)是什么,在深复制之后都会变成Object。并且undefined,function,symbol, RegExp等等类型复制不了。

2.ES6新特性拷贝 Object.assign({}, obj)

Object.assign方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。

缺点是:只能对一层进行深拷贝。慎用!

结语

以上是工作中常用到的深拷贝,当然还有其他的第三种,第四种,第五种。。。的深拷贝方式。在工作遇到的时候可以记录下来补上。

写到最后总结得差不多了,后续如果我想起还有哪些JS常用复制遗漏的,会继续在这篇文章上补全,同时也希望各位倔友对文章里的要点进行补充或者提出自己的见解。欢迎在下方进行评论或补充喔,喜欢的点个赞收个藏,保证你在开发时用得上。

最后送大家一个键盘!

(_=>[..."`1234567890-=~~QWERTYUIOP[]\\~ASDFGHJKL;'~~ZXCVBNM,./~"].map(x=>(o+=`/${b='_'.repeat(w=x<y?2:' 667699'[x=["Bs","Tab","Caps","Enter"][p++]||'Shift',p])}\\|`,m+=y+(x+'    ').slice(0,w)+y+y,n+=y+b+y+y,l+=' __'+b)[73]&&(k.push(l,m,n,o),l='',m=n=o=y),m=n=o=y='|',p=l=k=[])&&k.join`
`)()

专栏文章

专栏文章

《前端汇总》系列

《灵活运用》系列

随笔系列

点滴系列

教程系列

关注Uzero公众号,更多前端小干货等着你喔!

wechat-pn.jpg