js深拷贝爬坑之旅

JS深拷贝

在JS中,数据类型分为基本数据类型和引用数据类型两种,对于基本数据类型来说,它的值直接存储在栈内存中,而对于引用类型来说,它在栈内存中仅仅存储了一个引用,而真正的数据存储在堆内存中。

var one = {name:"wang"}
var two = one;
two.name = "fei"alert(one.name);

改变two的同时one也被改变了

深拷贝不会拷贝引用类型的引用,而是将引用类型的值全部拷贝一份,形成一个新的引用类型,这样就不会发生引用错乱的问题,使得我们可以多次使用同样的数据,而不用担心数据之间会起冲突

解决方法

<1>Object.assign()

var one = { name:"wang"}
var two = Object.assign({},one);
two.name = "fei";
alert(one.name);

改变two的同时one没有被改变

补:{…one} 同理
缺点:

只适合基础的数据类型

<2>使用JSON对象的stringify和parse方法

var one = {
         name:"wang",
         info:{
          age:20
         }
        }
var two = JSON.parse(JSON.stringify(one));
two.info.age = 18;
alert(one.info.age);

age

缺点:

不可以拷贝 undefined , function, RegExp 等等特殊类型

<3>使用递归

function deep(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] = deep(obj[key]);
        			} else {
          			objClone[key] = obj[key];
        			}
     		}
    		}
  	}
  	return objClone;
}
完美解决!!!
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值