深浅拷贝的分析


一、js的变量储存方式:栈(stack) 堆(heap)

	栈:自动分配内存空间,系统自动释放,里面存放的是基本数据类型的值和引用类型的地址
    堆:动态分配的内存,大小不定,也不会自动释放。里面存放引用类型的值


    基本类型:赋值   真正的值
	引用类型:赋值    引用类型的地址

二 、深浅拷贝(引用类型)

1、浅拷贝 传的是地址 一个改都改

在这里插入图片描述

1、深拷贝 传的是值 只改变自己改变对象 另一个对象没有变化

	深拷贝的三种方法
	1、for循环
	2、slience
	3、concat
	4、使用JSON.stringify()以及JSON.parse()
	5、 递归    (自身调用自身)
	//1、for循环
		 var arr_2=[1,2,3]
    var arr_3=[]
    for(var i=0;i<arr_2.length;i++){
        arr_3[i]=arr_2[i]
    }
    arr_3.push(4)
    console.log(arr_2);
    console.log(arr_3);
    //2、slience()
     var arr_4=[1,2,3]
    var arr_5=[]
    arr_5=arr_4.slice(0)
    arr_5.push(4)
    console.log(arr_4);
    console.log(arr_5);
      // 3、concat()	
      var arr_6=[1,2,3]
    var arr_7=arr_6.concat()
    arr_7.shift()
    console.log(arr_6);
    console.log(arr_7);
     // 对象 for in
    var obj_1={
        name:'name',
        age:18
    }
    var obj_2={}
    for(x in obj_1){
        obj_2[x]=obj_1[x]
    }
    obj_2.name='name1'
    console.log(obj_1);
    console.log(obj_2);
    四、如何进行深拷贝(四种方法)
1、使用JSON.stringify()以及JSON.parse()

let _tmp = JSON.stringify(obj);//将对象转换为json字符串形式

let result = JSON.parse(_tmp);//将转换而来的字符串转换为原生js对象

 var obj1 = {
    a: 1,
    b: 2,
    c: 3
}
var objString = JSON.stringify(obj1);
var obj2 = JSON.parse(objString);
obj2.a = 5;
console.log(obj1.a);  // 1
console.log(obj2.a); // 5
可以看到没有发生引用问题,修改obj2的数据,并不会对obj1造成任何影响
但是使用JSON.stringify()以及JSON.parse()它是不可以拷贝 undefinedfunction, RegExp 等等类型的
使用递归的方式实现数组、对象的深拷贝
function deepClone1(obj) {
  //判断拷贝的要进行深拷贝的是数组还是对象,是数组的话进行数组拷贝,对象的话进行对象拷贝
  var objClone = Array.isArray(obj) ? [] : {};
  //进行深拷贝的不能为空,并且是对象或者是
  if (obj && typeof obj === "object") {
    for (key in obj) {
      if (obj.hasOwnProperty(key)) {
        if (obj[key] && typeof obj[key] === "object") {
          objClone[key] = deepClone1(obj[key]);
        } else {
          objClone[key] = obj[key];
        }
      }
    }
  }
  return objClone;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值