JavaScript对象之深度克隆介绍

 更新时间:2014年12月08日 10:54:07   投稿:junjie  
这篇文章主要介绍了JavaScript对象之深度克隆介绍,本文详细的讲解了什么是对象深度克隆,并给出了示例代码,需要的朋友可以参考下

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

首先为什么要将一个对象进行深克隆?请允许我进行一个猜测:你有时一定会认为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交换变量常用4种方法解析

    JavaScript交换变量常用4种方法解析

    这篇文章主要介绍了JavaScript交换变量常用4种方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 使用echarts实现3d柱状图+折线图

    使用echarts实现3d柱状图+折线图

    这篇文章主要为大家详细介绍了如何使用echarts实现3d柱状图和折线图,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解一下
    2024-12-12
  • javascript动画之模拟拖拽效果篇

    javascript动画之模拟拖拽效果篇

    其实javascript本身是具有原生拖放功能的,但是由于兼容性问题,以及功能实现的方式,用的不是很广泛。javascript动画广泛使用的还是模拟拖拽。本文将详细介绍javascript的模拟拖拽,有需要的可以参考借鉴。
    2016-09-09
  • js实现拖拽功能

    js实现拖拽功能

    本文主要介绍了js实现拖拽效果的实例,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-03-03
  • 利用Javascript实现一套自定义事件机制

    利用Javascript实现一套自定义事件机制

    随着web技术发展,使用JavaScript自定义对象愈发频繁,让自己创建的对象也有事件机制,通过事件对外通信,能够极大提高开发效率。下面这篇文章主要给大家介绍了关于利用Javascript实现一套自定义事件机制的相关资料,需要的朋友可以参考下。
    2017-12-12
  • Firefox中beforeunload事件的实现缺陷浅析

    Firefox中beforeunload事件的实现缺陷浅析

    beforeunload 指在页面卸载前提供的最后一次JS执行的机会
    2012-05-05
  • window.event.keyCode兼容IE和Firefox实现js代码

    window.event.keyCode兼容IE和Firefox实现js代码

    window.event.keyCode兼容IE和Firefox具体实现代码如下,感兴趣的朋友可以参考下哈
    2013-05-05
  • Firefox下设为主页的JavaScript代码

    Firefox下设为主页的JavaScript代码

    在IE下,我们可以轻松使用以下代码来实现设置主页 但在firefox我们需要做的更多
    2008-09-09
  • 静态的动态续篇之来点XML

    静态的动态续篇之来点XML

    静态的动态续篇之来点XML...
    2006-12-12
  • js实现移动端图片滑块验证功能

    js实现移动端图片滑块验证功能

    这篇文章主要为大家详细介绍了js实现移动端图片滑块验证功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09

最新评论