深拷贝浅拷贝

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

浅拷贝是指只是复制了存数据的地址,并没有重新开辟数据,复杂的数据类型,比如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,具体使用请百度

posted @ 2018-12-14 21:13  爱吃巧克力的狗  阅读(228)  评论(0)    收藏  举报