zoukankan      html  css  js  c++  java
  • 深度克隆

    浅度克隆表现:

    var a="1";

    var b=a;
    b="2";
    console.log(a);// "1"
    console.log(b);// "2"
    说明:b不会改变a的值
     
    为啥要深度克隆?
    var arr=[1,2,3,4];
    var arr2=arr;
    arr2[0]=3;
    console.log(arr);//3,2,3,4
    console.log(arr);//3,2,3,4
    说明:如果arr2数组的第一个数改变,arr也改变了,显然,有的时候,这并不是我们想要的。
     
    下面为深度克隆的代码:
     1 function deepClone(obj){
     2     var result,oClass=isClass(obj);
     3         //确定result的类型
     4     if(oClass==="Object"){
     5         result={};
     6     }else if(oClass==="Array"){
     7         result=[];
     8     }else{
     9         return obj;
    10     }
    11     for(key in obj){
    12         var copy=obj[key];
    13         if(isClass(copy)=="Object"){
    14             result[key]=arguments.callee(copy);//递归调用
    15         }else if(isClass(copy)=="Array"){
    16             result[key]=arguments.callee(copy);
    17         }else{
    18             result[key]=obj[key];
    19         }
    20     }
    21     return result;
    22 }
    23 //返回传递给他的任意对象的类
    24 function isClass(o){
    25     if(o===null) return "Null";
    26     if(o===undefined) return "Undefined";
    27     return Object.prototype.toString.call(o).slice(8,-1);
    28 }
    29 var oPerson={
    30     oName:"rookiebob",
    31     oAge:"18",
    32     oAddress:{
    33         province:"beijing"
    34     },    
    35     ofavorite:[
    36         "swimming",
    37         {reading:"history book"}
    38     ],
    39     skill:function(){
    40         console.log("bob is coding");
    41     }
    42 };
    43 //深度克隆一个对象
    44 var oNew=deepClone(oPerson);
    45  
    46 oNew.ofavorite[1].reading="picture";
    47 console.log(oNew.ofavorite[1].reading);//picture
    48 console.log(oPerson.ofavorite[1].reading);//history book
    49  
    50 oNew.oAddress.province="shanghai";
    51 console.log(oPerson.oAddress.province);//beijing
    52 console.log(oNew.oAddress.province);//shanghai
  • 相关阅读:
    每天一个linux命令(权限):【转载】chgrp命令
    每天一个linux命令(权限):【转载】chmod命令
    每天一个linux命令(文件上传下载文件操作):【转载】gzip命令
    jsplumb 常用事件
    MarkDown
    el-menu 菜单展示
    sourcetree的使用
    git
    LTE FDD EPC网络规划设计与优化(“十二五”国家重点图书出版规划项目)
    详解UG NX9.0标准教程
  • 原文地址:https://www.cnblogs.com/xiaotaiyang/p/5906683.html
Copyright © 2011-2022 走看看