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判断页面加载状态以及添加遮罩和缓冲动画的代码
Oct 11 Javascript
利用jquery.qrcode在页面上生成二维码且支持中文
Feb 12 Javascript
javascript实现控制文字大中小显示
Apr 28 Javascript
javascript中eval和with用法实例总结
Nov 30 Javascript
jQuery动态添加与删除tr行实例代码
Oct 18 Javascript
JS作用域闭包、预解释和this关键字综合实例解析
Dec 16 Javascript
原生js实现无限循环轮播图效果
Jan 20 Javascript
AngularJS通过ng-Img-Crop实现头像截取的示例
Aug 17 Javascript
详解通过源码解析Node.js中cluster模块的主要功能实现
May 16 Javascript
Vue2实时监听表单变化的示例讲解
Aug 30 Javascript
详解ES6 Symbol 的用途
Oct 14 Javascript
javascript数组常见操作方法实例总结【连接、添加、删除、去重、排序等】
Jun 13 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将数据导入到Foxmail的实现代码
2010/09/05 PHP
php HTML无刷新提交表单
2016/04/05 PHP
使用php实现从身份证中提取生日
2016/05/09 PHP
PHP魔术方法以及关于独立实例与相连实例的全面讲解
2016/10/18 PHP
jQuery 树形结构的选择器
2010/02/15 Javascript
关于JavaScript定义类和对象的几种方式
2010/11/09 Javascript
Jquery公告滚动+AJAX后台得到数据
2011/04/14 Javascript
情人节之礼 js项链效果
2012/02/13 Javascript
HTML5之lang属性与dir属性的详解
2013/06/19 Javascript
Jquery封装tab自动切换效果的具体实现
2013/07/13 Javascript
导入extjs、jquery 文件时$使用冲突问题解决方法
2014/01/14 Javascript
JS运动基础框架实例分析
2015/03/03 Javascript
最简单的JavaScript验证整数、小数、实数、有效位小数正则表达式
2015/04/17 Javascript
基于jQuery实现的双11天猫拆红包抽奖效果
2015/12/01 Javascript
JavaScript实现倒计时跳转页面功能【实用】
2016/12/13 Javascript
利用js来实现缩略语列表、文献来源链接和快捷键列表
2016/12/16 Javascript
Angularjs+bootstrap+table多选(全选)支持单击行选中实现编辑、删除功能
2017/03/27 Javascript
js技巧之十几行的代码实现vue.watch代码
2018/06/09 Javascript
vue富文本编辑器组件vue-quill-edit使用教程
2018/09/21 Javascript
详解NodeJS Https HSM双向认证实现
2019/03/12 NodeJs
解决 viewer.js 动态更新图片导致无法预览的问题
2019/05/14 Javascript
基于JS实现视频上传显示进度条
2020/05/12 Javascript
JavaScript数组常用的增删改查与其他属性详解
2020/10/13 Javascript
浅谈Django中的数据库模型类-models.py(一对一的关系)
2018/05/30 Python
pyqt远程批量执行Linux命令程序的方法
2019/02/14 Python
python开发之anaconda以及win7下安装gensim的方法
2019/07/05 Python
python实现超市商品销售管理系统
2019/11/22 Python
pytorch实现focal loss的两种方式小结
2020/01/02 Python
SHEIN台湾:购买最新流行女装服饰
2019/05/18 全球购物
家长通知书家长评语
2014/04/17 职场文书
外贸业务员求职信
2014/06/16 职场文书
山东省召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
2015年街道除四害工作总结
2015/05/15 职场文书
2016年校长新年寄语
2015/08/17 职场文书
《浅水洼里的小鱼》教学反思
2016/02/16 职场文书
详解运行Python的神器Jupyter Notebook
2021/06/03 Python