本文摘自PHP中文网,作者青灯夜游,侵删。
本篇文章给大家介绍一下JavaScript中合并和克隆对象的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。当我们想要复制原始值和引用值(对象)时,它们的行为会大不相同。
原始值
我们假设一个变量 name
具有一个与之关联的原始值(number,string,boolean,undefined 和null)。 如果我们将此变量 name
复制到另一个变量name2
,则原始变量的任何修改都不会影响到第二个变量,因为它们是原始值。
1 2 3 4 5 |
|
引用值
但是,如果我们对引用类型的值进行相同的操作,则我们对一个变量所做的任何更改也将反映在另一个变量中,因为两个变量都指向同一对象。
数组
要拷贝数组,slice()
方法用于创建数组的新副本。 可以独立修改此副本,而不会影响原始数组。
如果未传递任何参数,则它会精确复制数组,但数字也可以作为参数传递。 如果仅传递一个数字,它将确定我们要从其进行复制的索引的值,而如果传递两个数字,则将标记开始和结束。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
对象
当引用值是一个对象时,也会发生同样的情况,对其属性之一的任何修改都会影响这两个变量。 若要克隆对象,请使用 Object.assign()
方法,该方法会将一个或多个源对象的所有可枚举属性的值复制到目标对象,但是此方法仅对对象的一个浅拷贝。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
要对对象进行深拷贝,需要使用其他方法。
正如我们所说,Object.assign()
方法只是一个浅拷贝(即,当我们的对象没有其他对象作为属性时)才有效。 在这些情况下,必须对对象进行深拷贝。
与浅拷贝不同,深拷贝以递归方式复制每个子对象,直到所有涉及的对象都被复制为止。
我们可以使用什么方法复制对象的深层副本?
JSON.parse(JSON.stringify(obj))
此方法使用JSON.stringify()
将对象转换为字符串,然后再用JSON.parse()
将其转换回对象。 此方法对简单对象有效,但如果对象属性是函数时无效。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
深度拷贝
另一种非常有趣和优雅的对象深度复制方法是使用递归函数。
我们创建了一个deepClone(object)
函数,将想要克隆的对象作为参数传递给它。在函数内部,将创建一个局部变量克隆,这是一个空对象,其中将从起始对象克隆的每个属性都将添加到该对象中。
具体思路:
- 如果该属性不是对象,则将其简单地克隆并添加到新的克隆对象中。
- 如果属性是对象,则再次执行
deepClone(value)
函数,并将属性的值(在这种情况下为对象)作为参数传递,并重复相同的过程。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
英文原文地址:https://www.ma-o.org/en/programming/javascript/the-javascript-asign-method-to-merge-and-clone-objects
作者:Luigi Nori
译者:前端小智
更多编程相关知识,请访问:编程视频!!
以上就是一文了解JavaScript中合并和克隆对象的方法的详细内容,更多文章请关注木庄网络博客!
相关阅读 >>
javascript之undefined与null的区别(详解)
更多相关阅读请进入《javascript》频道 >>

Vue.js 设计与实现 基于Vue.js 3 深入解析Vue.js 设计细节
本书对 Vue.js 3 技术细节的分析非常可靠,对于需要深入理解 Vue.js 3 的用户会有很大的帮助。——尤雨溪,Vue.js作者