深拷贝浅拷贝

了解一下深拷贝和浅拷贝并记录一下

浅拷贝是指只是复制了存数据的地址,并没有重新开辟数据,复杂的数据类型,比如object,array都是浅拷贝

var a=[1,2,3]
var b=a
console.log(a+'---'+b)
/**
 * 复制了a的
 */
a[1] = 33
console.log(a+'---'+b)

1398889-20181214210750897-1491326558.png
如果a为基本数据类型,就是深拷贝,经过测试发现可以直接用var b=a

var a=22
var b=a
console.log(a+'---'+b)
/**
 * 如果a为一个num类型
 */
a = 33
console.log(a+'---'+b)

1398889-20181214211016602-1436718812.png

解决办法:
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)

通过效果可以看得出可以改变,但是有缺点
1398889-20181214211832053-1215673192.png
该方法不是所有浏览器都支持,微信小程序不支持,且非标准格式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)

1398889-20181214215029653-1698700756.png

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,具体使用请百度

转载于:https://www.cnblogs.com/wzcsqaws/articles/10121713.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值