当我们想要复制原始值和引用值(对象)时,它们的行为会大不相同。

公司主营业务:成都网站制作、成都做网站、外贸营销网站建设、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联推出广安免费做网站回馈大家。
我们假设一个变量 name 具有一个与之关联的原始值(number,string,boolean,undefined 和null)。如果我们将此变量 name 复制到另一个变量name2 ,则原始变量的任何修改都不会影响到第二个变量,因为它们是原始值。
- let name="前端小智";
 - let name2= name;
 - console.log (name, name2); // 前端小智, 前端小智
 - name="王大冶";
 - console.log (name,name2); // 王大冶 前端小智
 
但是,如果我们对引用类型的值进行相同的操作,则我们对一个变量所做的任何更改也将反映在另一个变量中,因为两个变量都指向同一对象。
要拷贝数组,slice()方法用于创建数组的新副本。可以独立修改此副本,而不会影响原始数组。
如果未传递任何参数,则它会精确复制数组,但数字也可以作为参数传递。如果仅传递一个数字,它将确定我们要从其进行复制的索引的值,而如果传递两个数字,则将标记开始和结束。
- // 示例1
 - const names = ['前端小智', '王大冶', '小力'];
 - const names2 = names;
 - console.log(names, names2);
 - // ["前端小智", "王大冶", "小力"]
 - // ["前端小智", "王大冶", "小力"]
 - // 示例2
 - names2[2] = '前端小力';
 - console.log(names, names2);
 - // ["前端小智", "王大冶", "前端小力"]
 - // ["前端小智", "王大冶", "前端小力"]
 - // 示例3
 - const name2 = names.slice();
 - names[2] = '我是隔壁老智';
 - console.log(name2, names2)
 - // ["前端小智", "王大冶", "前端小力"]
 - // ["前端小智", "王大冶", "我是隔壁老智"]
 
当引用值是一个对象时,也会发生同样的情况,对其属性之一的任何修改都会影响这两个变量。若要克隆对象,请使用 Object.assign()方法,该方法会将一个或多个源对象的所有可枚举属性的值复制到目标对象,但是此方法仅对对象的一个浅拷贝。
- // 示例1
 - const names = {
 - name: '前端小智',
 - surname: '隔壁老智'
 - }
 - const names2 = names;
 - console.log(names, names2) // 打印结果是一模一样的
 - // 示例2
 - names2.surname ='隔壁老王';
 - console.log(names, names2)
 - // {name: "前端小智", surname: "隔壁老王"}
 - // {name: "前端小智", surname: "隔壁老王"}
 - // 示例3
 - const names3 = Object.assign({}, names);
 - names3.surname = '隔壁老色P';
 - console.log(names, names3)
 - // {name: "前端小智", surname: "隔壁老王"}
 - // {name: "前端小智", surname: "隔壁老色P"}
 
要对对象进行深拷贝,需要使用其他方法。
正如我们所说,Object.assign()方法只是一个浅拷贝(即,当我们的对象没有其他对象作为属性时)才有效。在这些情况下,必须对对象进行深拷贝。
与浅拷贝不同,深拷贝以递归方式复制每个子对象,直到所有涉及的对象都被复制为止。
我们可以使用什么方法复制对象的深层副本?
此方法使用JSON.stringify()将对象转换为字符串,然后再用JSON.parse()将其转换回对象。此方法对简单对象有效,但如果对象属性是函数时无效。
- const names = {
 - name: '前端小智',
 - surname: '隔壁老智',
 - social: {
 - wx: '大迁世界',
 - url: 'www.lsp.com'
 - }
 - }
 - const names2 = JSON.parse(JSON.stringify(names));
 - names2.social.url = 'www.baidu.com';
 - console.log(names, names2);
 - /**
 - {
 - name: "前端小智"
 - social: {wx: "大迁世界", url: "www.lsp.com"}
 - surname: "隔壁老智"
 - }
 - */
 - /**
 - {
 - name: "前端小智"
 - social: {wx: "大迁世界", url: "www.baidu.com"}
 - surname: "隔壁老智"
 - }
 - */
 
另一种非常有趣和优雅的对象深度复制方法是使用递归函数。
我们创建了一个deepClone(object)函数,将想要克隆的对象作为参数传递给它。在函数内部,将创建一个局部变量克隆,这是一个空对象,其中将从起始对象克隆的每个属性都将添加到该对象中。
具体思路:
- function deepClone(object) {
 - var clone = {};
 - for (var key in object) {
 - var value = object[key];
 - if (typeof(value) !== 'object') {
 - clone[key] = value;
 - } else {
 - clone[key]=deepClone(value);
 - }
 - }
 - return clone;
 - }
 - deepClone({value1:1,value2:{value3:2}});
 - //{value1:1,value2:{value3:2}}
 - deepClone({value1:1,value2:{value3:{value3b:3}}});
 - //{value1:1,value2:{value3:{value3b:3}}}
 
作者:Luigi Nori 译者:前端小智 来源:stackabuse
原文:https://www.ma-o.org/en/programming/javascript/the-javascript-asign-method-to-merge-and-clone-objects
            
            文章题目:在JavaScript中如何克隆对象?            
            网址分享:http://wtcwzsj.com/article/dhjigij.html
        
Copyright © 2009-2022 www.wtcwzsj.com 青羊区广皓图文设计工作室(个体工商户) 版权所有 蜀ICP备19037934号