资讯专栏INFORMATION COLUMN

对象复制

Eidesen / 3407人阅读

摘要:比如下面这个对象如何复制对象呢首先我们应该判断它是浅复制还是深复制。相对于深复制,浅复制非常易懂而且问题少的多。

声明本文摘抄《你不知道的javascript》上卷 110页。
如何复制一个对象,看起来应该有一个内置的copy()方法。实际上事情比你想象的更复杂,因为我们无法选择一个默认的复制算法。
比如下面这个对象

function fn (){}
var obj = {
    c: true
}
var array = [];
var myObj = {
    a: 2,
    b: obj,
    c: array,
    d: fn
};
array.push(obj, myObj)

如何复制myObj对象呢?

首先我们应该判断它是浅复制还是深复制。
对于浅复制来说,复制出的新对象中a的值会是旧对象中的值,就是2,但是新对象中b、c、d三个属性其实只是三个引用,他们和旧对象中b、c、d引用的对象是一样的。
对于深复制来说,除了复制myObj以外还会复制obj、array.这时问题就来了,array引用了obj和myObj,所以又需要复制myObj,这样就会导致死循环。

思考:复制一个函数意味着什么呢?有些人会通过toString()来序列化一个函数的源码(但是结果取决于js的具体实现,而且不同的引擎对于不同类型的函数处理方式并不完全相同)。
对于JSON安全(也就是说可以被序列化为一个JSON字符串并且可以根据这个字符串解析出一个结构和值完全一样的对象)的对象来说,有一种巧妙的复制方法:

var newObj = JSON.parse(JSON.stringify(someObj));

这个方法需要保证对象是JSON安全的,所以只适用于部分情况。

相对于深复制,浅复制非常易懂而且问题少的多。所以es6定义了object.assign()方法来实现浅复制。

object.assign({}, myObj);



文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/98852.html

相关文章

  • JavaScript对象的深浅复制

    摘要:本文是我在复制对象方面的一些心得总结,由浅复制到深复制,由只复制简单属性到复制,等复杂属性,层层递进。如有陈述不当之处,烦请指出,不胜感激。下面是一个简单的浅复制实现。 前言 从层次上来看,对象的复制可以简单地分为浅复制和深复制,顾名思义,浅复制是指只复制一层对象的属性,不会复制对象中的对象的属性,对象的深复制会复制对象中层层嵌套的对象的属性。在复制对象时,除了要复制对象的属性外,还要...

    B0B0 评论0 收藏0
  • GC_4_GC复制算法

    摘要:什么是复制算法复制算法是利用空间进行分配的。另一方面,因为复制算法只搜索并复制活动对象,所以跟一般的标记清除算法相比,它能在短时间内完成,也就是说其吞吐量优秀。在复制算法中,每次运行时都会执行压缩。 showImg(https://segmentfault.com/img/bVbdt4m?w=968&h=613); 4 GC复制算法   Copying GC是Marvin L.Mins...

    elarity 评论0 收藏0
  • 复制、浅复制与JQuery中的插件开发

    摘要:变量表示深度复制时原始值的修正值。中的复制方法复制的方法分别是和。此处不能正确处理的深复制综合三种方法来看不能复制对象以外的对象。 学习前端半年多了,还停留在新手村级,写的文章可能有很多问题,思维方式和逻辑上还不够严密,希望能指出问题,谢谢! ===================================================================== 数...

    sewerganger 评论0 收藏0
  • 详解js深浅复制

    摘要:从而也引出了所谓的深浅复制问题。附注对于浅复制,其实还有其他的实现方式,比如数组中和方法,对于这些还是希望大家自己了解,本本主要针对深浅复制的实现原理进行解析。 前言 在之前写继承的过程谈到了深浅复制的问题,因为有读者反映到需要解析,趁今天周末写一篇解析,今天的主体相对之前来说理解难度低一些,篇幅可能也比较短,诸君按需阅读即可。 从两种数据类型说起 在js中,变量的类型可以大致分成两种...

    Lin_YT 评论0 收藏0
  • Javascript系列之浅复制与深复制

    摘要:定义浅复制如果复制引用,复制后的引用都是指向同一个对象的实例,彼此之间的操作会互相影响。浅复制数组浅复制利用数组方法和返回新数组特性,进行复制。深复制对象深复制利用对象的和方法。 定义 浅复制 如果复制引用,复制后的引用都是指向同一个对象的实例,彼此之间的操作会互相影响。 深复制 深复制不是简单的复制引用,而是在堆中重新分配内存,并且把源对象实例的所有属性都进行新建复制,以保证深复制的...

    MonoLog 评论0 收藏0
  • 解析js对象的浅复制与深复制原理

    摘要:浅复制假设有两个对象现在想把对象的值复制给,由于对象的两个值都是原始类型,用浅复制即可。深复制简单来说深复制就是当遇到值是对象类型的时候就再运行一遍复制。 试想这样一种场景,自己编写了一个js插件,调用插件时参数是以对象的形式传入的,插件也有自己的默认值,当运行的时候就涉及到传入参数和默认值的合并,即用到对象的深复制和浅复制。 浅复制 假设有两个对象 var objA = { a:...

    wenyiweb 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<