js对象浅拷贝和深拷贝详解一样吗,js对象的深拷贝和浅拷贝

js对象浅拷贝和深拷贝详解一样吗,js对象的深拷贝和浅拷贝,js对象浅拷贝和深拷贝详解

本文主要详细介绍了JavaScript对象的浅层复制和深层复制代码,具有一定的参考价值。感兴趣的朋友可以参考一下。

本文分享JavaScript对象的浅层复制和深层复制代码,供大家参考。具体情况如下

1.浅拷贝

复制是将父对象的所有属性复制到子对象。

以下功能正在制作副本:

var中文={

国家:“中国”

}

var Doctor={

职业:“医生”

}

函数扩展复制(p) {

var c={ };

for(变量i in p) {

c[I]=p[I];

}

c . Uber=p;

返回c;

}

使用时,这样写:

var Doctor=extendCopy(中文);

Doctor.career=' doctor

alert(doctor . nation);//中国

但是,这样的文案有一个问题。也就是说,如果父对象的属性等于数组或者另一个对象,实际上子对象得到的只是一个内存地址而不是一个真实的副本,那么父对象就有被篡改的可能。

请看,现在给中文加一个“出生地”属性,它的值是一个数组。

Chinese.birthPlaces=['北京','上海','香港'];

通过extendCopy()函数,Doctor继承了中文。

var Doctor=extendCopy(中文);

然后,我们为博士的“出生地”添加一个城市:

医生.出生地.推送('厦门');

看输入结果。

警报(医生出生地);//北京、上海、香港、厦门

alert(中文出生地);//北京、上海、香港、厦门

结果两人的出生地都变了。

所以,extendCopy()只是复制基本类型的数据,我们称之为“浅层复制”。

2.深拷贝

因为浅抄有这样的弊端,所以我们来看看深抄。

所谓“深度复制”是指真正意义上的数组和对象的复制。其实现并不难,递归调用“轻拷贝”即可。

函数deepCopy(p,c) {

var c=c | | { };

for(变量i in p) {

if (typeof p[i]==='object') {

c[i]=(p[i]。构造函数===数组)?[] : {};

deepCopy(p[i],c[I]);

}否则{

c[I]=p[I];

}

}

返回c;

}

看一下用法:

var Doctor=deepCopy(中文);

现在,用数组值向父对象添加一个属性。然后,修改子对象的该属性:

Chinese.birthPlaces=['北京','上海','香港'];

医生.出生地.推送('厦门');

警报(医生出生地);//北京、上海、香港、厦门

alert(中文出生地);//北京、上海、香港

这就完成了复制;

$.extend()

$.jquery中的extend()与。

$.扩展([深度],目标,对象1 [,对象N ])

?deep

类型:布尔型

如果为true,合并将变成递归(也称为深度复制)。

?target

类型:对象

对象扩展。这将获得新的属性。

?object1

类型:对象

包含要合并到第一个参数中的附加属性的对象。

对象n

类型:对象

包括要合并到第一个参数中的附加属性。

当我们向$提供两个或更多的对象时。extend(),将对象的所有属性添加到目标对象(目标参数)。

如果只向$提供一个参数。extend(),意味着省略了目标参数。在这种情况下,默认情况下,jQuery对象本身就是目标对象。这样,我们可以在jQuery的名称空间下添加新的函数。当插件开发人员想要向jQuery添加新功能时,这很有用。

请记住,目标对象(第一个参数)将被修改,并将通过$返回。扩展()。但是,如果我们想保留原始对象,我们可以传递一个空对象作为目标对象:

var object=$。扩展({},object1,object 2);

默认情况下,通过$进行合并。extend()不是递归的;如果第一个对象本身的属性是一个对象或数组,那么它将使用与第二个对象相同的键完全重写一个属性。这些值不会被合并。您可以通过检查以下示例中banana的值来了解这一点。但是,如果将true作为该函数的第一个参数,将对对象执行递归合并。

警告:不支持为第一个参数传递false。

1. 合并两个对象,并修改第一个对象。

var object1={

苹果:0,

香蕉:{重量:52,价格:100 },

樱桃:97

};

var object2={

香蕉:{价格:200 },

榴莲:100

};

//将对象2合并到对象一中

$.extend(对象1,对象2);

//假设JSON.stringify -在IE8中不可用

控制台。log(JSON。stringify(对象1));

//{ '苹果':0,'香蕉':{ '价格':200},'樱桃':97,'榴莲':100}

2. 采用递归方式合并两个对象,并修改第一个对象。

var object1={

苹果:0,

香蕉:{重量:52,价格:100 },

樱桃:97

};

var object2={

香蕉:{价格:200 },

榴莲:100

};

//递归地将对象2合并到目标1中

$.extend( true,object1,object 2);

//假设JSON.stringify -在IE8中不可用

控制台。log(JSON。stringify(对象1));

//{ '苹果':0,'香蕉':{ '重量':52,'价格':200},'樱桃':97,'榴莲':100}

3. 合并 defaults 和 options 对象,并且不修改 defaults 对象。这是常用的插件开发模式。

var defaults={ validate: false,limit: 5,name:' foo ' };

var options={ validate: true,name:' bar ' };

//合并默认值和选项,不修改默认值

定义变量设置=$。扩展({},默认值,选项);

console.log(JSON.stringify(默认值));

控制台。log(JSON。stringify(选项));

控制台。log(JSON。stringify(设置));

//defaults - {'validate':false,' limit':5,' name':'foo'}

//options - {'validate':true,' name':'bar'}

//settings - {'validate':true,' limit':5,' name':'bar'}

Javascript 判断对象是否相等

在Java语言(一种计算机语言,尤用于创建网站)描述语言中相等运算包括"==","==="全等,两者不同之处,不必多数,本篇文章我们将来讲述如何判断两个对象是否相等?你可能会认为,如果两个对象有相同的属性,以及它们的属性有相同的值,那么这两个对象就相等。那么下面我们通过一个实例来论证下:

var obj1={

姓名:"本杰明",

性别:"男性"

}

var obj2={

姓名:"本杰明",

性别:"男性"

}

//输出:假

控制台。log(obj 1==obj 2);

//输出:假

控制台。log(obj 1===obj 2);

通过上面的例子可以看到,无论使用"=="还是"===",都返回错误。主要原因是基本类型字符串,数字通过值来比较,而对象(日期,数组)及普通对象通过指针指向的内存中的地址来做比较。看下面一个例子:

var obj1={

姓名:"本杰明",

性别:"男性"

};

var obj2={

姓名:"本杰明",

性别:"男性"

};

var obj3=obj1

//输出:真

控制台。log(obj 1==obj 3);

//输出:真

控制台。log(obj 1===obj 3);

//输出:假

控制台。log(obj 2==obj 3);

//输出:假

控制台。log(obj 2===obj 3);

上例返回没错,是因为obj1和ob3的指针指向了内存中的同一个地址。和面向对象的语言(Java/C语言)中值传递和引用传递的概念相似。因为,如果你想判断两个对象是否相等,你必须清晰,你是想判断两个对象的属性是否相同,还是属性对应的值是否相同,还是怎样?

功能人(姓名){

this.name=name

}

var p1=新人(‘P1’);

变量p2=新人(' p2 ');

控制台。log(P1==p2);//假

人。原型。say hi=function(){

//在这里打招呼

}

控制台。日志(P1。sayhi()==p2。say hi());//真

控制台。日志(P1。sayhi()===p2。say hi());//真

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: