JavaScript对象之深度克隆介绍


Posted in Javascript onDecember 08, 2014

也不知道从什么时候开始,前端圈冒出了个新词:对象深度克隆。看起来好像很高大上的样子,实际上并不新鲜,在我们的实际项目开发中,你可能早已用到,只不过由于汉字的博大精深,有些原本很简单的事物被一些看似专业的词汇稍加修饰,就变得神秘起来了。

首先为什么要将一个对象进行深克隆?请允许我进行一个猜测:你有时一定会认为js的内置对象document太长,那么你可能会这样做:

var d = document;

d.by = function(id){

    return d.getElementById(id);

};

d.by('id').innerHTML = 'hello sentsin';

上述代码对document.getElementById进行了简化,同时在原document对象中也增加了一个by的成员方法,你可以通过document.hasOwnProperty('by')返回的状态值来验证你的判断。再看下面一个例子。

var person = {name: '贤心', profession: '前端开发', place: '杭州'};

var newPerson = person;

newPerson.age = '24';

console.log(person);

//结果:{name: '贤心', profession: '前端开发', place: '杭州', age: 24}

由此可见,将一个对象通过简单的传递给一个新的变量时,仅仅只是给该对象增添了一个别名。这意味着,通过对该别名的操作,原有对象键值会发生改变。但问题在于,有时我们希望newPerson完全独立于person,彼此之间不存在同步关系,那么就需要生成一个副本,请看例子:

var cloneObj = function(obj){

    var str, newobj = obj.constructor === Array ? [] : {};

    if(typeof obj !== 'object'){

        return;

    } else if(window.JSON){

        str = JSON.stringify(obj), //系列化对象

        newobj = JSON.parse(str); //还原

    } else {

        for(var i in obj){

            newobj[i] = typeof obj[i] === 'object' ? 

            cloneObj(obj[i]) : obj[i]; 

        }

    }

    return newobj;

};


//测试

var obj = {a: 0, b: 1, c: 2};

var arr = [0, 1, 2];

//执行深度克隆

var newobj = cloneObj(obj);

var newarr = cloneObj(arr);

//对克隆后的新对象进行成员删除

delete newobj.a;

newarr.splice(0,1);

console.log(obj, arr, newobj, newarr);

//结果: {a: 0, b: 1, c: 2}, [0, 1, 2], {b: 1, c: 2}, [1, 2];

这便是所谓的对象克隆。不过有几处需要解释一下。代码中的JSON对象及其成员方法stringify和parse属于ECMAScript5规范,它们分别负责将一个对象(包括数组对象)转换成字符串,和还原,从而实现对象的深拷贝。那么对于低级浏览器(如IE),拷贝数组的话,可以用newobj.concat(obj),而普通对象,就索性枚举赋值好了。

Javascript 相关文章推荐
js window.event对象详尽解析
Feb 17 Javascript
用js脚本控制asp.net下treeview的NodeCheck的实现代码
Mar 02 Javascript
append和appendTo的区别以及appendChild用法
Dec 24 Javascript
JavaScript Serializer序列化时间处理示例
Jul 31 Javascript
jQuery焦点控制图层展示延迟隐藏的方法
Mar 09 Javascript
在JavaScript中使用对数Math.log()方法的教程
Jun 15 Javascript
第一次接触神奇的Bootstrap导航条
Aug 09 Javascript
JSON与js对象序列化实例详解
Mar 16 Javascript
详解ES6之用let声明变量以及let loop机制
Jul 15 Javascript
javascript连接mysql与php通过odbc连接任意数据库的实例
Dec 27 Javascript
vue.js 实现点击展开收起动画效果
Jul 07 Javascript
详解ECMAScript2019/ES10新属性
Dec 06 Javascript
SeaJS 与 RequireJS 的差异对比
Dec 08 #Javascript
JavaScript中的ArrayBuffer详细介绍
Dec 08 #Javascript
JS实现仿京东淘宝竖排二级导航
Dec 08 #Javascript
js继承call()和apply()方法总结
Dec 08 #Javascript
ANGULARJS中用NG-BIND指令实现单向绑定的例子
Dec 08 #Javascript
详解Javascript动态操作CSS
Dec 08 #Javascript
jquery.ajax之beforeSend方法使用介绍
Dec 08 #Javascript
You might like
php获取网页上所有链接的方法
2015/04/03 PHP
PHP执行linux命令常用函数汇总
2016/02/02 PHP
使用php完成常见的文件上传功能(推荐)
2017/01/13 PHP
在 Laravel 6 中缓存数据库查询结果的方法
2019/12/11 PHP
学习YUI.Ext 第二天
2007/03/10 Javascript
JavaScript 在线压缩和格式化收藏
2009/01/16 Javascript
Javascript下IE与Firefox下的差异兼容写法总结
2010/06/18 Javascript
JavaScript通过function定义对象并给对象添加toString()方法实例分析
2015/03/23 Javascript
DEDECMS如何为文章添加HOT NEW标志图片
2015/08/14 Javascript
使用BootStrap实现用户登录界面UI
2016/08/10 Javascript
监控微信小程序中的慢HTTP请求过程详解
2019/07/05 Javascript
JavaScript Array对象基本方法详解
2019/09/03 Javascript
基于layui table返回的值的多级嵌套的解决方法
2019/09/19 Javascript
vue中后端做Excel导出功能返回数据流前端的处理操作
2020/09/08 Javascript
vue 获取元素额外生成的data-v-xxx操作
2020/09/09 Javascript
python操作mysql中文显示乱码的解决方法
2014/10/11 Python
python模块之paramiko实例代码
2018/01/31 Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
2019/10/10 Python
python中dict()的高级用法实现
2019/11/13 Python
Ubuntu下Python+Flask分分钟搭建自己的服务器教程
2019/11/19 Python
Python爬虫JSON及JSONPath运行原理详解
2020/06/04 Python
python smtplib发送多个email联系人的实现
2020/10/09 Python
python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解
2020/12/22 Python
HTMl5的存储方式sessionStorage和localStorage详解
2014/03/18 HTML / CSS
深入解析HTML5 Canvas控制图形矩阵变换的方法
2016/03/24 HTML / CSS
html5实现移动端适配完美写法
2017/11/16 HTML / CSS
法国奢华女性时尚配饰网上商店:Monnier Frères
2016/08/27 全球购物
印度排名第一的蛋糕、鲜花和礼品送货:Winni
2019/08/02 全球购物
毕业生就业推荐信范文
2013/12/01 职场文书
班组长安全生产职责
2013/12/16 职场文书
入职担保书怎么写
2014/05/12 职场文书
合作经营协议书范本
2014/09/16 职场文书
毕业生评语大全
2015/01/04 职场文书
小石潭记导游词
2015/02/03 职场文书
Win10系统下配置Java环境变量
2021/06/13 Java/Android
【海涛教你打dota】体验一超神发条:咱是抢盾专业户
2022/04/01 DOTA