JavaScript 深拷贝与浅拷贝

首先了解一下深拷贝与浅拷贝。

在js中把一个对象的属性与方法复制给另一个对象,或者是将父对象的属性拷贝给子对象,称为拷贝。

所谓浅拷贝(shallow copy),就是对象被拷贝时,实际上拷贝的只是该对象在内存中的位置指针(也可以说是该对象的引用)。在这种情况下,如果我们修改拷贝对象,就相当于修改了原对象。

深拷贝(deep copy)实现方式与浅拷贝基本相同,但是它避免了修改原对象这一问题。首先也是通过遍历对象的属性来进行拷贝操作,只是在遇到一个对象引用性的属性时,需要再次对其调用深拷贝函数,彻底拷贝该对象。

image-20210926140348545

浅拷贝的实现方式:

1.直接赋值(for…in)

function shallowCopy(p){
	var c={};
	for(var i in p){
		c[i]=p[i];
	}
	return c;
}

2.ES6的对象新方法Object.assign()

Object.assign(target,source1,source2),用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。该方法第一个参数是目标对象,后面的参数都是源对象。

注:当对象只有一层时,Object.assign()实现的是深拷贝。

深拷贝的实现方式:

1.当对象只有一层时,可以用ES6的对象新方法Object.assign()

2.递归

function deepCopy(p,c){
	c=c || {};
	for(var i in p){ //遍历一个对象的可枚举属性(包括对象本身的所有可枚举属性,以及对象从其构造函数原型中继承的属性)
		if(p.hasOwnProperty(i)){ //检测i是不是对象p本身的一个属性或对象,继承的属性不显示
			if(typeof p[i] ==='object'){
				c[i]=Array.isArray(p[i]) ? [] : {}; //区分Array对象和Object对象
				deepCopy(p[i],c[i]);
			}else{
				c[i]=p[i];
			}
		}
	}
	return c;
}

3.先用JSON.stringify()转换成JSON格式,再用JSON.parse()转回对象

4.使用jQuery的$.extend(true,{},obj)

var fileref=document.createElement('script');
fileref.setAttribute('type','text/javascript');
fileref.setAttribute('src','https://code.jquery.com/jquery-latest.js');
document.getElementsByTagName('head')[0].appendChild(fileref);

接着再执行$.extend()方法:

注:用jQuery的$.extend({},obj)可以实现对象的浅拷贝!!

ES6对象和函数

var a = {}

此时a是一个对象,是一个没有任何属性的对象。

var a = {'name':'object'}

此时,a是一个对象,是一个有一个属性的对象,属性名为name,属性的值为object。

访问对象属性的两种方式:

1、alert(a.name)

2、 alert(a[name])

二、var a = function(){}

var a = function(){}

a指向一个函数,相当于有一个函数,名为a,可以这么调用这个函数。

a()

var a = funciton() { alert(1); }

//直接调用,此时a是一个函数,调用a()执行的是函数体,也就是 alert(1)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值