文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

在 JavaScript 中如何克隆对象?

2024-12-03 04:30

关注

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

原始值

我们假设一个变量 name 具有一个与之关联的原始值(number,string,boolean,undefined 和null)。如果我们将此变量 name 复制到另一个变量name2 ,则原始变量的任何修改都不会影响到第二个变量,因为它们是原始值。

  1. let name="前端小智"
  2. let name2= name
  3. console.log (name, name2); // 前端小智, 前端小智 
  4. name="王大冶"
  5. console.log (name,name2); // 王大冶 前端小智 

引用值

但是,如果我们对引用类型的值进行相同的操作,则我们对一个变量所做的任何更改也将反映在另一个变量中,因为两个变量都指向同一对象。

数组

要拷贝数组,slice()方法用于创建数组的新副本。可以独立修改此副本,而不会影响原始数组。

如果未传递任何参数,则它会精确复制数组,但数字也可以作为参数传递。如果仅传递一个数字,它将确定我们要从其进行复制的索引的值,而如果传递两个数字,则将标记开始和结束。

  1. // 示例1 
  2. const names = ['前端小智''王大冶''小力']; 
  3. const names2 = names; 
  4. console.log(names, names2); 
  5. // ["前端小智""王大冶""小力"]  
  6. // ["前端小智""王大冶""小力"]  
  7.  
  8. // 示例2 
  9. names2[2] = '前端小力'
  10. console.log(names, names2); 
  11. //  ["前端小智""王大冶""前端小力"]  
  12. //  ["前端小智""王大冶""前端小力"]  
  13.  
  14. // 示例3 
  15. const name2 = names.slice(); 
  16. names[2] = '我是隔壁老智'
  17. console.log(name2, names2) 
  18. // ["前端小智""王大冶""前端小力"
  19. //  ["前端小智""王大冶""我是隔壁老智"

对象

当引用值是一个对象时,也会发生同样的情况,对其属性之一的任何修改都会影响这两个变量。若要克隆对象,请使用 Object.assign()方法,该方法会将一个或多个源对象的所有可枚举属性的值复制到目标对象,但是此方法仅对对象的一个浅拷贝。

  1. // 示例1 
  2. const names = { 
  3.   name'前端小智'
  4.   surname: '隔壁老智' 
  5.  
  6. const names2 = names; 
  7. console.log(names, names2) // 打印结果是一模一样的 
  8.  
  9. // 示例2 
  10. names2.surname ='隔壁老王'
  11. console.log(names, names2) 
  12.  
  13. // {name"前端小智", surname: "隔壁老王"
  14. // {name"前端小智", surname: "隔壁老王"
  15.  
  16. // 示例3 
  17. const names3 = Object.assign({}, names); 
  18. names3.surname = '隔壁老色P'
  19. console.log(names, names3) 
  20.  
  21. // {name"前端小智", surname: "隔壁老王"
  22. // {name"前端小智", surname: "隔壁老色P"

要对对象进行深拷贝,需要使用其他方法。

正如我们所说,Object.assign()方法只是一个浅拷贝(即,当我们的对象没有其他对象作为属性时)才有效。在这些情况下,必须对对象进行深拷贝。

与浅拷贝不同,深拷贝以递归方式复制每个子对象,直到所有涉及的对象都被复制为止。

我们可以使用什么方法复制对象的深层副本?

JSON.parse(JSON.stringify(obj))

此方法使用JSON.stringify()将对象转换为字符串,然后再用JSON.parse()将其转换回对象。此方法对简单对象有效,但如果对象属性是函数时无效。

  1. const names = { 
  2.   name'前端小智'
  3.   surname: '隔壁老智'
  4.   social: { 
  5.     wx: '大迁世界'
  6.     url: 'www.lsp.com' 
  7.   } 
  8. const names2 = JSON.parse(JSON.stringify(names)); 
  9. names2.social.url = 'www.baidu.com'
  10. console.log(names, names2); 
  11.  
  12.  
  13.  
  14.  

深度拷贝

另一种非常有趣和优雅的对象深度复制方法是使用递归函数。

我们创建了一个deepClone(object)函数,将想要克隆的对象作为参数传递给它。在函数内部,将创建一个局部变量克隆,这是一个空对象,其中将从起始对象克隆的每个属性都将添加到该对象中。

具体思路:

  1. function deepClone(object) { 
  2.   var clone = {}; 
  3.   for (var key in object) { 
  4.     var value = object[key]; 
  5.     if (typeof(value) !== 'object') { 
  6.       clone[key] = value; 
  7.     } else { 
  8.       clone[key]=deepClone(value); 
  9.     } 
  10.   } 
  11.   return clone; 
  12. }  
  13.  
  14. deepClone({value1:1,value2:{value3:2}}); 
  15. //{value1:1,value2:{value3:2}} 
  16. deepClone({value1:1,value2:{value3:{value3b:3}}}); 
  17. //{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

 

来源: 大迁世界 内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯