原生JavaScript之深度克隆
先看一下克隆成功后的结果
深度克隆就是将obj的属性克隆到obj1上面,并且在obj上面修改属性不影响obj1上面的属性。
1、先把所有的值都遍历一遍(看是引用值和原始值)
用for ( var prop in obj ),对象和数组都可以使用
2、判断是原始值,还是引用值?用typeof判断是不是object
1)如果是原始值就直接拷贝
2)如果是引用值,判断是数组还是对象
3、判断是数组还是对象?(方法instanceof【看a的原型链上有没有b的原型】、toString、constructor,建议用toString,另外两个有个小bug——跨父子域不行)
1)如果是数组,就新建一个空数组;
2)如果是对象,就新建一个空对象。
4、建立了数组以后,如果是挨个看原始对象里面是什么,都是原始值就可以直接考过来了;或者,建立了对象以后,挨个判断对象里面的每一个值,看是原始值还是引用值
5、递归

准备好要克隆的对象,还有接收克隆过来的对象
var obj = {
name :"abc",
age : 9,
sex :"female",
card : ['visa','master'],
wife : {
name : "bcd",
son : {
name : "bcd",
son : "xx"
}
}
}
var obj1 = {
}
写克隆的代码,步骤解释在代码注释里面
function deepClone(origin,target){ // 传入参数
var target = target || {}, // 防止没有写接收克隆的目标,所以兼容一下,如果没有就用空对象去接收
toStr = Object.prototype.toString, // 把原型上的toString付给toStr
arrStr = "[object Array]";
for(var prop in origin){ //循环起源对象
if(origin.hasOwnProperty(prop)){ //不拿原型上的东西,如果有原型上的属性就不进入判断
if(origin[prop] !== "null" && typeof(origin[prop]) == 'object'){ //不拿起源对象上面为空的值,拿原始值
if(toStr.call(origin[prop]) == arrStr){ //为数组否则为对象
target[prop] = []; //创建空数组接收
}else{
target[prop] = {};//创建空对象接收
}
deepClone(origin[prop],target[prop]);//再传入参数,执行递归,重复判断这整个流程
}else{
target[prop] = origin[prop]; //如果是应用值直接付给目标
}
}
}
return target; //防止没写接收的目标,返回克隆完成后的目标
}
谢谢观看,如果大佬经过请多指教! 谢谢观看,如果大佬经过请多指教! 谢谢观看,如果大佬经过请多指教!
原生JavaScript之深度克隆的更多相关文章
- javascript最新深度克隆对象方法
javascript最新深度克隆对象方法 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &qu ...
- JavaScript的深度克隆
1.JavaScript的五种基本数据类型: Number.String.Boolean.null.undefined. 2.typeof返回的六种数据类型: Number.String.Boolea ...
- [转载] javascript实现深度克隆
js一般有两种不同数据类型的值: 基本类型(包括undefined,Null,boolean,String,Number),按值传递: 引用类型(包括数组,对象),按址传递,引用类型在值传递的时候是内 ...
- javascript构造函数深度克隆递归
<script type="text/javascript"> var obj={ name:'段丛磊', gex:18, sss:['李伟',18], fun:fun ...
- 原生js实现深度克隆
总体思路: 判断对象当中的值为引用值还是原始值 如果是引用值,判断是数组还是对象,如果是原始值直接copy 递归 注意:不要忘了排除null,因为typeof null = 'object' func ...
- JavaScript实现对象的深度克隆及typeof和instanceof【简洁】【分享】
JavaScript实现对象的深度克隆 代码实现如下: <!DOCTYPE html> <html lang="en"> <head> < ...
- javascript中对象的深度克隆
记录一个常见的面试题,javascript中对象的深度克隆,转载自:http://www.2cto.com/kf/201409/332955.html 今天就聊一下一个常见的笔试.面试题,js中对象的 ...
- javascript深度克隆与javascript的继承实现
1.javascript深度克隆: //注意这里的对象包括object和array function cloneObject(obj){ var o = obj.constructor === Arr ...
- Javascript深度克隆一个对象
Javascript中的对像赋值与Java中是一样的,都为引用传递.就是说,在把一个对像赋值给一个变量时,那么这个变量所指向的仍就是原来对 像的地址.那怎么来做呢?答案是“克隆”. 克隆有两种方法:一 ...
随机推荐
- jenkins节约硬盘空间的几个办法
jenkins真是费硬盘和内存,我们先聊聊硬盘问题怎么解决: 1.不要保留太多的构建记录.发布包数量 相关描述如下:取最先匹配进行执行 2.构建完,删除吧
- delphi 的结构体对齐关键字
Align fields (Delphi) Go Up to Delphi Compiler Directives (List) Index Type Switch Syntax {$A+}, { ...
- 在SUSE12中使用 Machinery 进行高级系统管理
简单介绍 在 SUSE Linux Enterprise 12 中.SUSE 如今推出了面向系统管理员的 Machinery.作为其高级系统管理模块的一部分.Machinery 是适用于 Linux ...
- 如何在 Linux 环境下配置 Nagios Remote Plugin Executor (NRPE)
为 NRPE 配置自定义命令 远程服务器上安装 下面列出了一些可以用于 NRPE 的自定义命令.这些命令在远程服务器的 /etc/nagios/nrpe.cfg 文件中定义. ## 当 1.5.15 ...
- POJ 1436 Horizontally Visible Segments(线段树)
POJ 1436 Horizontally Visible Segments 题目链接 线段树处理染色问题,把线段排序.从左往右扫描处理出每一个线段能看到的右边的线段,然后利用bitset维护枚举两个 ...
- BZOJ 1091([SCOI2003]分割多边形-分割直线)
1091: [SCOI2003]分割多边形 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 223 Solved: 82 [Submit][id=10 ...
- Deepin-还原Windows平台
首次启动! 是不是感觉很迷茫呢? 找不到存在感 先设置成Windows那种高校模式(右键下面任意区域) OK了吧,然后我们找到“启动器”或者按Windows键(在Deepin linux我们称为Sup ...
- Linux_C——动态库,静态库
/usr/lib /lib:标准系统库文件 库是一组预先编译好的函数的集合,这些函数都是按照可重用的原则编写的.它们通常有一组相互关联的函数组成以 执行某项常见的任 ...
- The Pilots Brothers' refrigerator-DFS路径打印
I - The Pilots Brothers' refrigerator Time Limit:1000MS Memory Limit:65536KB 64bit IO Format ...
- JavaScript基本类型与引用类型
前面已经说过,JavaScript变量是松散类型,它可以保存任何类型的值.变量的值以及数据类型可以在脚本的生命周期内发生改变.变量包含两种不同类型的值:基本类型和引用类型.基本类型值的是简单的数据段, ...