zoukankan      html  css  js  c++  java
  • javascript 深拷贝

    javascript存在两种拷贝:浅拷贝、深拷贝。

    它们最大的区别在于引用类型的拷贝上:浅拷贝复制的是引用(指针),深拷贝复制的是里面的数据。

    由于以上原因,在下例中 浅拷贝修改的值影响了声明的对象a。

    var a = {};
    var b= a;    //浅拷贝
    b.testStr = "我被改变了!";
    alert(a.testStr);    //显示"我被改变了";说明b的改变同时对a造成了影响

    所以,为了避免这种情况,在javascript需要考虑可能进行深拷贝的类型有: Object{}、String、Array[];同时可能对深拷贝的判断造成影响的数据类型有undefined、null;(这部分有待更新)

    1、在网上搜索了一个极其简单的深拷贝的方法,就是利用JSON的函数。

    var dataObjCloned=JSON.parse(JSON.stringify( dataObj )) 

    这种方式十分简单,无需自己去写函数;但是是有局限性的,即“这种方法只在纯数据的数组或者对象克隆中有效”。具体的验证过程请参考 http://www.jb51.net/article/33108.htm

    对于存在“非纯数据的数组或者对象”的拷贝,则只能自己去写函数进行处理。

    2、对于仅存在数组的深拷贝,请参考 http://www.jsann.com/post/JavaScript_deep_copy_and_shallow_copy.html ;其中包括两种方式,即使用.slice(0)或.concat();

    3、对于同时包含其他类型、如对象等内容的深拷贝,需要自己写函数,请参考 http://blog.csdn.net/wanmingtom/article/details/7988284

    4、深拷贝要慎用,因为“对象或实例的属性不可能全部是公有的,一旦存在私有变量(原文中叫状态state),你这样的复制便毫无意义,因为会丢失这些数据”。具体请继续参考http://blog.csdn.net/wanmingtom/article/details/7988284

    5、利用jQuery的extend进行深拷贝,请参考http://api.jquery.com/jQuery.extend/

  • 相关阅读:
    oracle数据库闪回执行步骤——oracle数据库回退
    10.20总结
    10.11总结
    10.10总结
    10.9总结
    10.8总结
    10.7总结
    10.6总结
    10.5总结
    10.4总结
  • 原文地址:https://www.cnblogs.com/zldream1106/p/3177447.html
Copyright © 2011-2022 走看看