一. 合并与克隆的差别

1. 克隆是特殊的合并(以空对象作为目标对象,非空对象作为源对象进行合并),克隆要求目标对象与源对象的 constructor相同。

2. 克隆的源对象只有一个,合并的源对象可以是多个。

二. 合并的方法

1.Object.assign():

例:var obj1 ={

m : 1,

n : 2,

j : {

r : {

h : 2

},

p : 4 } ,

p : 1

}

var obj2 ={ m : 2 , n : undefined, j : { h : 2 ,o:  3}}

var obj3 = Object.assign(obj1,obj2);

结果:obj1 = { m : 2,n : undefined, j : { h : 2, o : 3 }, p : 1 };

obj2 ={ m : 2 , n : undefined, j : { h : 2, o : 3 } };

obj3 ={ m : 2 , n : undefined, j : { h : 2, o : 3 }, p : 1 };

注意:1).  目标对象自身也会变  obj1===obj3

2). 此方法为浅合并

3). undefined参与合并

4). 原型不属性参与合并

2. $.extend:

情况一:

例:var obj1 ={ m : 1, n : 2, j : { r : { h : 2 }, p : 4 }, p : 1 }

var obj2 ={ m : 2, n : undefined, j : { h : 2, o : 3 } }

var obj3 = $.extend(obj1,obj2);

结果:obj1 = { m : 2, n : 2, j : { h : 2, o : 3 }, p : 1 };

obj2 ={ m : 2, n : undefined, j : { h : 2, o : 3 } };

obj3 ={ m : 2, n : 2, j : { h : 2, o : 3 }, p : 1 };

注意:1).  目标对象自身也会变  obj1===obj3

2). 此方法为浅合并

3). undefined不参与合并

4). 原型不属性参与合并

情况二:

例:var obj1 ={ m : 1, n : 2, j : { r : { h : 2 }, p : 4 }, p : 1 }

var obj2 ={ m : 2, n : undefined, j : { h : 2, o : 3 } }

var obj4 = $.extend({},obj1,obj2);

结果:obj1 = { m : 1, n : 2, j : { r : { h : 2 }, p : 4 }, p : 1 };

obj2 ={ m : 2, n : undefined, j : { h : 2, o : 3 } };

obj3 ={ m : 2, n : 2, j : { h : 2, o : 3 }, p : 1 };

注意:1).  此方法为浅合并

2). undefined不参与合并

3). 原型不属性参与合并

情况三:

例:var obj1 ={ m:1,n:2,j:{r:{h:2},p:4},p:1}

var obj2 ={m:2,n:undefined,j:{h:2,o:3}}

var obj3 = $.extend(true,obj1,obj2);

结果:obj1 = {m:2,n:2,j:{h:2,o:3,r:{h:2},p:4},p:1};

obj2 ={m:2,n:undefined,j:{h:2,o:3}};

obj3 ={m:2,n:2,j:{h:2,o:3,r:{h:2},p:4},p:1};

注意:1).  目标对象自身也会变  obj1===obj3

2). 此方法为深合并

3). undefined不参与合并

4). 原型不属性参与合并

3. 遍历赋值法

思路:将obj2中存在的属性但obj1不存在的属性赋值给obj1。

步骤:1). 遍历obj2中属性。

2). 判断obj1不存在此属性

3). 将次值赋给obj1

var extentObj = function(obj1,obj2){

for(let key in obj2){

  if(obj2.hasOwnProperty(key) && (!obj1.hasOwnProperty(key))){

    obj1[key] = obj2[key]

   }

 }

}

三. 克隆的方法

1. JSON.parse(JSON.stringify()):

1). 先将对象变为字符串,然后再变为json对象,防止对象的指针指向问题,为深拷贝

2). undefined 和 function 类型的属性会被忽略,而 Date 类型的属性则会被转换为字符串

2. $.extend:

传true为深拷贝,不传为浅拷贝

注意:深拷贝与浅拷贝的区别

浅拷贝直接把引用地址原样拿来,此时,不管源对象还是目标对象,修改引用属性后另一个对象的同名属性都会受到影响。

深拷贝则会递归地在目标对象上创建值,目标对象和源对象之间将完全独立

JS----对象的合并与克隆的更多相关文章

  1. js 对象的合并(3种方法)转载

    对象的合并 需求:设有对象 o1 ,o2,需要得到对象 o3 var o1 = { a:'a' }, o2 = { b:'b' }; // 则 var o3 = { a:'a', b:'b' } 方法 ...

  2. js对象简单、深度克隆(复制)

    javascript的一切实例都是对象,只是对象之间稍有不同,分为原始类型和合成类型.原始类型对象指的是字符串(String).数值(Number).布尔值(Boolean),合成类型对象指的是数组( ...

  3. js对象的合并

    问题情况:将2个或2个以上对象(object{....})中的属性进行合并,即最后合并为一个object{.....}传递给后端. 问题场景:多页表单数据的一同提交 解决办法:Object.assig ...

  4. js 对象(object)合并

    var obj1 = { name:'lisi', checked:'true' }; var obj2 = { name:'zhangsan', age:18 }; Object.assign(ob ...

  5. js对象合并

    实现js对象大合并,ES6之前就只有循环遍历咯.可以用ES6的话可以用Object.assign(). 以下是Object.assign()示例: var o1 = { a: 1 }; var o2 ...

  6. js对象的深度克隆

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. JS 两个对象数组合并并去重

    JS两个对象数组合并并去重 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  8. js对象详解(JavaScript对象深度剖析,深度理解js对象)

    js对象详解(JavaScript对象深度剖析,深度理解js对象) 这算是酝酿很久的一篇文章了. JavaScript作为一个基于对象(没有类的概念)的语言,从入门到精通到放弃一直会被对象这个问题围绕 ...

  9. JS对象复制

    在JavaScript很多人复制一个对象的时候都是直接用"=",因为大家都觉得脚本语言是没有指针.引用.地址之类的,所以直接用"="就可以把一个对象复制给另外一 ...

  10. 超实用的JavaScript代码段 Item8 -- js对象的(深)拷贝

    js 对象 浅拷贝 和 深拷贝 1.浅拷贝 拷贝就是把父对像的属性,全部拷贝给子对象. 下面这个函数,就是在做拷贝: var Chinese = { nation:'中国' } var Doctor ...

随机推荐

  1. Go语言基础之切片

    Go语言基础之切片 本文主要介绍Go语言中切片(slice)及它的基本使用. 引子 因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性. 例如: func arraySum(x ...

  2. 剑指offer——python【第23题】二叉搜索树的后序遍历序列

    题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 解题思路 首先要清楚,这道题不是让你去判断一个给定 ...

  3. SyntaxError: invalid character in identifier(Python)

    在写博客时直接将博客上的代码复制运行后发现错误SyntaxError: invalid character in identifier,我以为是l(小L)写成了1,改了还是不行. 上网查了下,发现原来 ...

  4. 基于STM32的USB枚举过程学习笔记(转)

    之前使用ST官方的库以及网络的资料,完成了使用USB HID类进行STM32和PC机的通讯.由于其他原因并没有深入的分析,虽然实现了功能,但是关于USB设备的枚举,以及具体的通讯方式都没有清晰的概念, ...

  5. graph engine

    有个侥幸的机会,参与了微软的项目,侥幸的接触了,graph engine图形数据库,感觉很是新颖,做点记录,和大家分享,理解有限,发现不足之处,还请指点. 微软发分布式图处理引擎GraphEngine ...

  6. Express全系列教程之(六):cookie的使用

    一.关于Cookie 在我们关闭一个登录过的网址并重新打开它后,我们的登录信息依然没有丢失:当我们浏览了商品后历史记录里出现了我们点击过的商品:当我们推回到首页后,推荐商品也为我们选出了相似物品:事实 ...

  7. mysql中的count()函数

    1.count()函数是用来统计表中记录的一个函数,返回匹配条件的行数. 2.count()语法: (1)count(*)---包括所有列,返回表中的记录数,相当于统计表的行数,在统计结果的时候,不会 ...

  8. 基于ROS的分布式机器人远程控制平台

    基于ROS的分布式机器人远程控制平台   1 结构说明 HiBot架构主要使用C/S架构,其中HibotServer为服务器,Muqutte为消息服务器中间件,HiBotClient为运行在机器人上的 ...

  9. 支持Linux系统的加密狗

    深思数盾 https://www.sense.com.cn/ 产品:精锐5 版本:标准版.精灵版.IE版.时钟锁 快速实现高安全度的软件保护,轻松定义多种授权模式1.防止软件盗版,防止逆向工程 通过增 ...

  10. Cocos Creator (webgl模式下怎么让canvas背景透明)

    项目中构建出web-mobile包后,打开main.js 在main.js中加入如下两行即可让canvas变透明 cc.director.setClearColor(new cc.Color(0,0, ...