了解一下深拷贝和浅拷贝并记录一下
浅拷贝是指只是复制了存数据的地址,并没有重新开辟数据,复杂的数据类型,比如object,array都是浅拷贝
var a=[1,2,3]
var b=a
console.log(a+'---'+b)
/**
* 复制了a的
*/
a[1] = 33
console.log(a+'---'+b)
如果a为基本数据类型,就是深拷贝,经过测试发现可以直接用var b=a
var a=22
var b=a
console.log(a+'---'+b)
/**
* 如果a为一个num类型
*/
a = 33
console.log(a+'---'+b)
解决办法:
1 使用Json的方法
var a=[1,2,3]
//把数组转化为字符串
var c = JSON.stringify(a)
//把字符串转化为数组
var b=JSON.parse(c)
console.log(a+'---'+b)
a[1]=33
console.log(a+'---'+b)
通过效果可以看得出可以改变,但是有缺点
该方法不是所有浏览器都支持,微信小程序不支持,且非标准格式json会有问题,比如JSON不支持函数、引用、undefined、RegExp、Date
原文链接:https://www.cnblogs.com/fundebug/p/7381337.html
2 使用递归拷贝
//递归拷贝的方法
function clone(object){
var object2;
if(!(object instanceof Object)){
return object;
}else if(object instanceof Array){
object2=[];
}else if(object instanceof Function){
object2=eval(object.toString);
}else if(object instanceof Object){
object2={};
}
for(let key in object){
object2[key]=clone(object[key]);
}
return object2;
}
var a = {z:'33',x:'44',c:'55'}
var b= clone(a)
console.log(a)
console.log(b)
a.z='123'
console.log(a)
console.log(b)
3 使用es6的扩展运算符
var a = {z:'33',x:'44',c:'55'}
var b= {...a}
console.log(a)
console.log(b)
/**
* 复制了a的
*/
a.z='123'
console.log(a)
console.log(b)
扩展运算符还可以实现apply的部分功能
扩展运算符:https://www.cnblogs.com/websmile/p/8328138.html
4 如果是一层深拷贝还可以用,Object.assign方法和数组的slice和concat,具体使用请百度