精华内容
下载资源
问答
  • js实现复制对象、扩展对象 方法

    千次阅读 2018-03-04 13:22:48
    jquery里有extend方法来扩展对象,但如果我们只用js,怎么来实现扩展对象呢? 不废话直接上代码,看了就懂。 源代码://******** 深复制对象 ******** function cloneObj(oldObj) { if(typeof(oldObj) != 'object...

    jquery里有extend方法来扩展对象,但如果我们只用js,怎么来实现扩展对象呢?


    1、ES6提供了Object.assign() ,用于合并/复制对象的属性。

    Object.assign(target, source_1, ..., source_n)

    它会依次把 source_1, …, source_n 等对象的属性 复制 到 target对象中,最后返回target对象。当遇到同名属性时,后添加的对象属性会覆盖先添加的对象属性。

    var o = {
        'a':1,
        'b':2
    };
    var a = {
        'b':3,
        'c':5
    };
    console.log(Object.assign({}, o, a));//{a: 1, b: 3, c: 5}

    2、对于ES5,可以自己写一个extend方法
    源代码:

    //******** 深复制对象 ********
    function cloneObj(obj) {
        var newObj = obj.constructor === Array ? []:{};
        newObj.constructor = obj.constructor;
        if(typeof obj !== "object"){ 
            return ;
        } else if(window.JSON){
            newObj = JSON.parse(JSON.stringify(obj));//若需要考虑特殊的数据类型,如正则,函数等,需把这个else if去掉即可
        } else {
            for(var prop in obj){
                if(obj[prop].constructor === RegExp ||obj[prop].constructor === Date){
                    newObj[prop] = obj[prop];
                } else if(typeof obj[prop] === 'object'){
                    newObj[prop] = deepCopy(obj[prop]);//递归
                } else {
                    newObj[prop] = obj[prop];
                }
            }
        } 
        return newObj;
    };
    
    //******** 扩展对象 ********
    function extendObj() {
        if(arguments.length < 1){return 0;}
        var tempobj = cloneObj(arguments[0]); //调用复制对象cloneObj方法
        for(var n = 1;n < arguments.length;n++){
            for(var key in arguments[n]){
                tempobj[key] = arguments[n][key];
            }
        }
        return tempobj;
    };
    
    //******** 测试 扩展对象 ********
    //让obj3继承obj1和obj2
    var obj1 = {name:"bty",age:12};
    var obj2 = {sex:"boy"};
    var obj3 = extendObj(obj1,obj2); 
    console.log(obj3.age); //12
    
    //******** 测试 复制对象 ********
    var obj2 = cloneObj(obj1);//深复制对象
    obj1.name = "ssh";//修改obj1.name值,但下面obj2.name值不变
    console.log(obj2.name);   //bty

    注:这里我们写方法的时候,不要用Array.prototype.name 的形式,因为上面cloneObj方法中我们涉及到了for-in遍历,如果用了改写原型的方式写方法,遍历时会把原型的方法也遍历进去,这不是为我们想要的结果。

    展开全文
  • javascript 数组以及对象的深拷贝(复制数组或复制对象)的方法前言在js中,数组和对象复制如果使用=号来进行复制,那只是浅拷贝。如下图演示: 如上,arr的修改,会影响arr2的值,这显然在绝大多数情况下,并...

    javascript 数组以及对象的深拷贝(复制数组或复制对象)的方法

    前言

    在js中,数组和对象的复制如果使用=号来进行复制,那只是浅拷贝。如下图演示:

    如上,arr的修改,会影响arr2的值,这显然在绝大多数情况下,并不是我们所需要的结果。
    因此,数组以及对象的深拷贝就是javascript的一个基本功了。

    评论中有很多人说我误导大家。说这些都是浅拷贝。我不做过深的阐述,本文中涉及到的都是比较浅显的内容。诸位请根据自己的需要以及情况自行判断和理解。

    数组的深拷贝

    条条大道通罗马,实现数组的深拷贝,是有好几种方法的。举例如下:

    for 循环实现数组的深拷贝

    for循环是非常好用的。如果不知道高级方法,通过for循环能够完成我们大多数的需求。

    var arr = [1,2,3,4,5]
    var arr2 = copyArr(arr)
    function copyArr(arr) {
    	let res = []
    	for (let i = 0; i < arr.length; i++) {
    	 res.push(arr[i])
    	}
    	return res
    }
    

    如上,通过对数组的for循环,即可实现对数组的深拷贝了。

    slice 方法实现数组的深拷贝

    这个代码实现非常简单。原理也比较好理解,他是将原数组中抽离部分出来形成一个新数组。我们只要设置为抽离全部,即可完成数组的深拷贝。代码如下:

    var arr = [1,2,3,4,5]
    var arr2 = arr.slice(0)
    arr[2] = 5
    console.log(arr)
    console.log(arr2)
    

    运行结果如下:

    更多 slice 内容请访问 w3school JavaScript slice 方法

    concat 方法实现数组的深拷贝

    这个代码也非常简单,原理更加粗暴。它是用于连接多个数组组成一个新的数组的方法。那么,我们只要连接它自己,即可完成数组的深拷贝。代码如下:

    var arr = [1,2,3,4,5]
    var arr2 = arr.concat()
    arr[2] = 5
    console.log(arr)
    console.log(arr2)
    

    运行结果如下:

    更多 concat 内容请访问 w3school JavaScript concat 方法

    2017年10月31日补充:ES6扩展运算符实现数组的深拷贝

    OK,以上之前讲的方法全部过时了,用下面的方法实现数组的深拷贝是最简单的。

    var arr = [1,2,3,4,5]
    var [ ...arr2 ] = arr
    arr[2] = 5
    console.log(arr)
    console.log(arr2)
    

    运行结果如下:

    ES6扩展运算符实现数组的深拷贝

    对象的深拷贝

    对象的深拷贝相比数组也没有困难许多,列举两个方法。

    万能的for循环实现对象的深拷贝

    在很多时候,for循环能够解决大问题。

    var obj = {
      name: 'FungLeo',
      sex: 'man',
      old: '18'
    }
    var obj2 = copyObj(obj)
    function copyObj(obj) {
      let res = {}
      for (var key in obj) {
        res[key] = obj[key]
      }
      return res
    }
    

    转换成json再转换成对象实现对象的深拷贝

    上面的代码实在是比较长,所以,用一个更暴力的方法吧!代码如下:

    var obj = {
      name: 'FungLeo',
      sex: 'man',
      old: '18'
    }
    var obj2 = JSON.parse(JSON.stringify(obj))
    

    这个原理没什么好解释的,实在是够简单粗暴的啦!

    2017年10月31日补充: 扩展运算符实现对象的深拷贝

    var obj = {
      name: 'FungLeo',
      sex: 'man',
      old: '18'
    }
    var { ...obj2 } = obj
    obj.old = '22'
    console.log(obj)
    console.log(obj2)
    

    运行结果如下:

    扩展运算符实现对象的深拷贝

    小结

    数组和对象的深拷贝是js中最常见的应用。理解各种方法是必须的。希望对大家有所帮助。
    本文中并没有对异常进行处理,主要在讲原理。更多的数组以及对象的操作方法,可以参考lodash的源码,查看它的源码可以让你的js基础变得非常牢固。我也在学习中。

    2017年10月31日补充,使用es6提供的扩展运算符的方法实现深拷贝,简单,高效。并且,对象的深拷贝不会像使用 JSON 方法深拷贝一样,丢失函数等信息,只能用来深拷贝 JSON 数据格式的对象。推荐大家使用。

    补充一个数组去重的方法

    function dedupe(array) {
      return [...new Set(array)]
    }
    var arr = [1,2,2,3,3,4,4,5,5]
    console.log(dedupe(arr))
    

    运行结果如下:

    JS数组去重的方法

    2021年03月29日 补充

    这里说的深拷贝,都是指一维的数组和对象的深拷贝。鉴于评论中多人指出,这些是浅拷贝,我本来不想回应,但是提出这个观点的人很多,因此我在这边回应一下。

    浅拷贝的概念不重复了,上文中已经说明。文章中的多种方法,均不是浅拷贝,只是是否支持多维数据而已。而在绝大多数场景下,文中的方法是适用的。

    想要简便的支持多维数据的深拷贝,可以直接适用 JSON 方式。或适用 lodash 工具实现。

    版权申明:本文由FungLeo原创,允许转载,但转载必须附注首发链接。谢谢。

    展开全文
  • 使用fastjson实现对象的深复制

    千次阅读 2019-06-05 14:14:25
    最近遇到一个坑,之前的代码将一个订单对象中的明细,一个list,进行了分组。...这里,一定要实现复制,不然只进行浅复制的话,list内的值还是使用的同一块内存中的。进行分组后,原参数还是会被改变。 所以...

    最近遇到一个坑,之前的代码将一个订单对象中的明细,一个list,进行了分组。然后这个list就改变了。再往后,他们认为这个list没变,又将这个list作为最终数据进行了发送。这就导致这个明细回传错误。

    查出问题后,我就想,将这个对象如果赋值一份的吧。应该就没问题了。

    这里,一定要实现深复制,不然只进行浅复制的话,list内的值还是使用的同一块内存中的。进行分组后,原参数还是会被改变。

    所以这里我想到用fastjson提供的序列化能力,先将对象序列化成一个json字符串,然后再反序列化回来。

    这样,相当于按照一个字符串序列化了一个新对象,开辟了一个新的内存用于存放这个对象的堆内存内容。这就不会导致原有对象的改变了。

    具体代码很简单:

    String listStr = JSONObject.toJSONString(param.getDetailItems());
    List<Dto> list = JSONObject.parseArray(listStr,Dto.class);
    

    目前这方案是没有问题的。这期间我也了解了很多关于对象复制的问题。后续会找机会把最近找到的对象复制的相关内容写一个博客。

    展开全文
  • js实现对象复制,不影响原对象

    千次阅读 2018-10-23 10:52:14
    假如源对象的属性值是一个指向对象的引用,它也只拷贝那个引用值。 eg: var obj1 = { a: 0 , b: { c: 0}}; var obj2 = Object.assign({}, obj1);//将obj的可枚举的属性值复制到{}中 console.log(JSON...
    展开全文
  • 1.为什么要使用BeanUtils组件? 由于我们经常操作javabean,很频繁的get和set来实现属性的复制,apache提供了这个BeanUtils来实现直接对象的拷贝...实现对象复制: public class User { private Integer id; priv
  • Nodejs 实现对象的深度复制

    千次阅读 2018-03-15 14:49:18
    nodejs中不提供clone方法,解决方法是:let tmpPackage = JSON.parse(JSON.stringify(API_ROUTES.trademark));或者let cloned = Object.assign({}, source);let cloned = { ... source }; // 仅限ES6...
  • jq的extend()方法能很方便的实现扩展对象方法,这里要实现的是:原生js实现复制对象,扩展对象,类似jq中的extend()方法,需要的朋友可以参考下 q的extend()方法能很方便的实现扩展对象方法,语法如下:$.extend...
  • java Map 复制对象复制

    万次阅读 2016-10-26 14:55:16
    1.java里的clone分为:  A:浅复制(浅克隆): 浅复制仅仅复制所考虑的对象,而不复制它...序列化的对象实现Serializable接口才能实现序列化。 序列化后,通过反序列化可以得到和当前对象一样的对象。 @Suppre
  • * 利用反射实现对象之间相同属性复制 * * @param source 要复制的 * @param to 复制给 */ public static void copyProperties(Object source, Object target) throws Exception { ...
  • Android或java中对象复制

    千次阅读 2019-06-27 17:51:37
    做项目过程中有需求用到对象复制内容, 在此随手记录一下. 为何要复制对象, 在此就不做细数, 下面简单说明文字+代码. 对象复制, 总体来将, 分为三种方法. 方法一: 用getter和setter挨个进行赋值, 这种方式简单, ...
  • 但是这种方法不管是ES6还是ES5实现,都有同样的缺陷,就是只能实现特定的object的深度复制(比如数组和函数),不能实现包装对象Number,String , Boolean,以及Date对象,RegExp对象复制。 1 . 前文的方法 ...
  • C# 实现一个对象的深复制的方法

    千次阅读 2019-01-08 17:20:37
    /// 使用序列化的方法实现复制 /// &lt;/summary&gt; /// &lt;typeparam name="T"&gt;&lt;/typeparam&gt; /// &lt;param name="source"&gt;&lt;/param&...
  • Java Bean对象复制的三种方式详解

    千次阅读 2020-04-25 22:58:18
    一般Java对象复制包含**浅拷贝、深度复制、BeanUtils.copyProperties()**等三种方式。 对象的克隆是指创建一个新的对象,且新的对象的状态与原始对象的状态相同且我们对新对象修改时,不影响原对象的状态。 原理...
  • 大部分的引用类型,实现的都是浅拷贝,引用类型对象之间的赋值,就是复制一个对象引用地址的副本,而指向的对象实例仍然是同一个。 深拷贝:指对象的子段被拷贝,同时字段引用的对象也进行了拷贝。深拷贝创建的是...
  • SpringBoot 如何进行对象复制,老鸟们都这么玩的!

    千次阅读 多人点赞 2021-09-23 14:36:08
    今天带来SpringBoot老鸟系列的第四篇,来聊聊在日常开发中如何优雅的实现对象复制。 首先我们看看为什么需要对象复制? 为什么需要对象复制 如上,是我们平时开发中最常见的三层MVC架构模型,编辑操作时Controller...
  • 对象复制工具类,实现方法如下: 复制对象(深度拷贝) 复制集合(深度拷贝) 复制对象到指定类(深度拷贝) 复制集合到指定类(深度拷贝) POM <!-- 对象拷贝 --> <dependency> <groupId>uk...
  • 欢迎加入Unity业内qq交流群:956187480 qq扫描二维码加群 ...下面两种方式可以实现对象赋值给同类型的对象,这两个对象的堆栈信息是不一样的。 方法一: 必须对对象进行序列化处理 public...
  • 细说java对象的浅复制和深复制

    千次阅读 2016-10-22 13:53:23
    复制和深复制的区别 ...实现复制和深复制,主要是使用cloneable接口的clone方法,还是比较简单的,不多说了,直接上代码。 浅复制(shallow clone) public class Husband implements Cloneable { private int
  • 如何实现对象克隆

    千次阅读 2019-06-04 11:08:41
    情景:在我们实际的开发过程中,一个对象A中已经包含了一些有用的信息,现在我需要复制A的内容到B。...1.实现Cloneable接口,并重写object类中的clone方法,可以实现浅克隆,也可以实现深度克隆。 2.实现...
  • BeanCopier对象复制学习

    万次阅读 2017-04-11 10:55:14
    BeanCopier是Cglib包中的一个类,用于对象复制。 注意:目标对象必须先实例化 而且对象必须要有setter方法 初始化例子: BeanCopier copier = BeanCopier.create(Source.class, Target.class, false); ...
  • 当组件间传递对象时,由于此对象的引用类型指向的都是一个地址(除了基本类型跟null,对象之间的赋值,只是将地址指向同一个,而不是真正意义上的拷贝),如下 数组: var a = [1,2,3]; var b = a; b.push(4); // ...
  • 对象复制和对象赋值的区别

    千次阅读 2012-08-30 15:23:20
     复制构造函数用于将一个对象复制到新创建的对象中。也就是说,它用于初始化过程中,而不是常规的赋值过程中。类的复制构造函数原型通常如下:  class_name(const class_name&);  它接受一个指向类对象的常量...
  • js中复制对象的属性值给新的对象

    万次阅读 2019-07-05 17:10:32
    我们有一个对象,且包含很多属性值和方法,但是我们想把它的内部属性复制给一个新的对象时,我们如何去做呢? 你可能会说直接 a = b就可以了。 no no no,这样两个对象其实指针指向的还是一个内存中的对象,当一个...
  • 对象的深度复制

    千次阅读 2015-03-04 11:30:35
    浅复制:将一个对象复制后,基本类型都会重新创建,而引用类型指向的还是原对象所指的引用; 深复制:讲一个对象复制后,不论是基本类型还是引用类型都是重新创建的。 下面看我们的深度复制方法 package ...
  • C++对象的赋值和复制

    千次阅读 2017-11-09 12:37:06
    13.对象的赋值和复制对象的赋值:C++中对象可以使用”=”进行赋值,通过重载”=”号运算符实现,实际上这个过程是通过成员赋值(mewberwise copy)实现的,即将一个对象的成员一一赋值给另一对象的对应成员。...
  • C#对象复制探讨

    千次阅读 2009-07-26 15:31:00
    对象复制探讨对象复制的种类:1.构造复制函数;2.克隆方法;1. 构造复制函数(以下摘抄自MSDNhttp://msdn.microsoft.com/zh-cn/library/ms173116(VS.80).aspx)与有些语言不同,C# 不提供复制构造函数。如果您创建...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 717,485
精华内容 286,994
关键字:

哪些可以实现对象的复制