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 相关文章推荐
Locate a File Using a File Open Dialog Box
Jun 18 Javascript
Jquery Select操作方法集合脚本之家特别版
May 17 Javascript
从阶乘函数对比Javascript和C#的异同
May 31 Javascript
JS window对象的top、parent、opener含义介绍
Dec 03 Javascript
JSONP跨域的原理解析及其实现介绍
Mar 22 Javascript
原生js实现图片放大缩小计时器效果
Jan 20 Javascript
gulp教程_从入门到项目中快速上手使用方法
Sep 14 Javascript
vue权限路由实现的方法示例总结
Jul 29 Javascript
解决vue-cli项目打包出现空白页和路径错误的问题
Sep 04 Javascript
vue2.0 可折叠列表 v-for循环展示的实例
Sep 07 Javascript
JavaScript的console命令使用实例
Dec 03 Javascript
Node.js Domain 模块实例详解
Mar 18 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的单引号和双引号 字符串效率
2009/05/27 PHP
解决PHP 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory
2017/02/25 PHP
通过DOM脚本去设置样式信息
2010/09/19 Javascript
prettify 代码高亮着色器google出品
2010/12/28 Javascript
js同比例缩放图片的小例子
2013/10/30 Javascript
JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)
2014/08/16 Javascript
nodejs中转换URL字符串与查询字符串详解
2014/11/26 NodeJs
JavaScript中的数值范围介绍
2014/12/29 Javascript
JavaScript转换二进制编码为ASCII码的方法
2015/04/16 Javascript
jquery显示loading图片直到网页加载完成的方法
2015/06/25 Javascript
JavaScript基于ajax编辑信息用法实例
2015/07/15 Javascript
js中的内部属性与delete操作符介绍
2015/08/10 Javascript
浅谈Jquery中Ajax异步请求中的async参数的作用
2016/06/06 Javascript
JavaScript实现大图轮播效果
2017/01/11 Javascript
vue项目实战总结篇
2018/02/11 Javascript
vue计算属性和监听器实例解析
2018/05/10 Javascript
vue webpack开发访问后台接口全局配置的方法
2018/09/18 Javascript
layui 对table中的数据进行转义的实例
2019/09/12 Javascript
vant IndexBar实现的城市列表的示例代码
2019/11/20 Javascript
Vue使用虚拟dom进行渲染view的方法
2019/12/26 Javascript
node.js使用http模块创建服务器和客户端完整示例
2020/02/10 Javascript
[26:40]DOTA2上海特级锦标赛A组资格赛#1 Secret VS MVP.Phx第一局
2016/02/25 DOTA
python判断、获取一张图片主色调的2个实例
2014/04/10 Python
python Pygame的具体使用讲解
2017/11/03 Python
html5构建触屏网站之网站尺寸探讨
2013/01/07 HTML / CSS
非凡女性奢华谦虚风格:The Modist
2017/10/28 全球购物
贯彻学习两会心得体会范文
2014/03/17 职场文书
学校安全生产月活动总结
2014/07/05 职场文书
班级团队活动方案
2014/08/14 职场文书
党员干部观看《周恩来四个昼夜》思想汇报
2014/09/10 职场文书
沙滩主题婚礼活动策划方案
2014/09/15 职场文书
2015年教师学期工作总结
2015/04/30 职场文书
本科毕业论文致谢词
2015/05/14 职场文书
基于Python编写简易版的天天跑酷游戏的示例代码
2022/03/23 Python
Vue中使用import进行路由懒加载的原理分析
2022/04/01 Vue.js
SQL Server #{}可以防止SQL注入
2022/05/11 SQL Server