在前端开发中,经常需要对对象进行复制以及传递数据。而在复制对象时,有时候需要的是对象的引用,而有时候则需要的是对象的副本。对于 JavaScript 开发者来说,实现对象的浅拷贝和深拷贝是必不可少的操作。
什么是浅拷贝和深拷贝?
当我们复制一个对象时,其实是将一个对象的引用复制给了新的对象。这时候,原对象和新对象指向的是同一个内存地址。当我们修改原对象时,新对象的值也会受到影响。
而浅拷贝则是复制了原对象的基本类型数据和引用类型数据的地址,新对象和原对象的引用类型数据指向同一个地址。这意味着,如果我们修改了新对象的引用类型数据,原对象也会被修改。
深拷贝则是完全复制原对象的数据,生成一个新的对象,新对象与原对象没有任何引用关系。
如何实现浅拷贝?
在 ES6 之前,我们可以使用 Object.assign(target, source)
实现对象的浅拷贝。但是 Object.assign 只是复制了对象的二级属性,如果目标对象中已经存在了这个属性,它就会被覆盖。而且,Object.assign 没有办法复制对象的所有属性,比如对象的原型链、不可枚举的属性等,因此我们需要使用 ES8 的 Object.getOwnPropertyDescriptors 和 Reflect.ownKeys 方法实现浅拷贝。
-- -------------------- ---- ------- --- - -------- - ------ -------- ------ ---- - ------ -------- ------ --- - ------- -------- ---- -- -------- -------------------- ------- - ----- ----------- - ----------------------------------------- --- ------ --- -- ----------------------------- - -- ---- --- ------------- -- --- --- ----------- -- --- --- ------- - ---------------------- ------- ---- --------------------------------------- ---- -- - - ------ ------- -
如何实现深拷贝?
实现深拷贝需要递归复制对象的属性,直到复制完所有的属性。我们可以使用 JSON.parse(JSON.stringify(object)) 实现深拷贝,但是这种方法虽然简单,但是会存在一些问题,比如它不能复制特殊类型的属性,比如 Date, RegExp, Error 等等。而且,它也不能复制对象的原型链。因此,我们需要使用递归的函数遍历对象的属性,然后将属性一一复制到新的对象上。
-- -------------------- ---- ------- --- - -------- - ------ -------- --- ------ - ------- -------- ---- -- -------- -------------- - -------- ----------------------- - ----- ------ - --------------------- - -- - --- ------------------------------------- -- - ----- ----- - ------------ -- ------- ----- --- -------- -- ----- --- ----- - ----------- - ----------------------- - ---- - ----------- - ------ - --- ------ ------- - ------ --------------------- -
使用以上代码,我们就可以实现对象的浅拷贝和深拷贝了。让我们来看一下具体的示例。
示例代码
-- -------------------- ---- ------- -- -------- ----- ------ - - ----- ------- ---- --- ------ ----------- --------- -- ----- ------------ - --- -------------------------- -------- ---------------------------------- -------------------------- -- ----------- -------- --------- -- -------- ----- ---- - - ----- -------- ---- --- ------- - --------- -------- ------ -------------- -------- ----------- ------- -- -- ----- ---------- - ---------------- ---------------------------------------------- ---------------------------------- -- -------- ------ -------------
总结
在 JavaScript 中实现对象的浅拷贝和深拷贝是一项很重要的技能。通过使用 ES8 的 Object.getOwnPropertyDescriptors 和 Reflect.ownKeys 方法,我们可以实现对象的浅拷贝。而使用递归方法遍历对象的属性,我们也可以实现对象的深拷贝。在开发中,根据具体的需求,我们可以选择合适的方式实现对象的复制。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/646c5843968c7c53b0b561dd