通过递归的方式实现深度clone

来源:互联网 发布:suse linux snmp 安装 编辑:程序博客网 时间:2024/05/18 01:32

预备知识:

各种数据类型的赋值方法及类型判断方法

值类型和引用类型的区别

数组和对象的遍历方法

递归算法

 

预计工作量

半小时

 

具体描述

实现方法clone,可以用其针对可能是任何类型的对象,进行值拷贝

例如

var a = 1;

var b = clone(a);

b = 2;

console.log(a, b); // 1, 2

--------

var a = [1, 2];

var b = clone(a);

a[0] = 'changed a';

b[1] = 'changed b';

console.log(a, b); // a:['changed a', 2],b:[1, changed b]

--------

var a = {

   key1: 'value1',

   key2: [{

       id: 1,

       data: [10, 20]

   }, {

       id: 2,

       data: [20, 30]

   }]

}

var b = clone(a);

b.key1 = 'value changed';

b.key2[1].data[0] = 'changed data';

console.log(a, b);

==============================================================================================================================

javascript类型判断 typeof

基本类型:传值 Number Boolean null undefined

引用类型:传引用 Array、Object、function

特殊类型 String :传值

数组和对象的遍历方法:http://www.cnblogs.com/yun007/archive/2013/06/06/3121393.html

数组:由于 for in 循环会枚举原型链上的所有属性,唯一过滤这些属性的方式是使用hasOwnProperty 函数,因此会比普通的 for 循环慢上好多倍。
为了达到遍历数组的最佳性能,推荐使用经典的 for 循环,通过 l = list.length 来缓存数组的长度。

var list = [1, 2, 3, 4, 5, ...... 100000000];for(var i = 0, l = list.length; i < l; i++) {    console.log(list[i]);}


对象:遍历对象的所有属性值和方法http://www.cnblogs.com/xiangniu/archive/2012/08/19/2646393.html

/** 用来遍历指定对象所有的属性名称和值* obj 需要遍历的对象* author: Jet Mah* website: http://www.javatang.com/archives/2006/09/13/442864.html */ function allPrpos(obj) {     // 用来保存所有的属性名称和值    var props = "";    // 开始遍历    for(var p in obj){         // 方法        if(typeof(obj[p])=="function"){             obj[p]();        }else{             // p 为属性名称,obj[p]为对应属性的值            props+= p + "=" + obj[p] + "\t";        }     }     // 最后显示所有的属性    alert(props);}

总结:遍历数组和对象的区别

<script>    //----------------for用来遍历数组对象--    var i,myArr = [1,2,3];    for (var i = 0; i < myArr.length; i++) {        console.log(i+":"+myArr[i]);    };    //---------for-in 用来遍历非数组对象    var man ={hands:2,legs:2,heads:1};    //为所有的对象添加clone方法,即给内置原型(object,Array,function)增加原型属性,该方法很强大,也很危险    if(typeof Object.prototype.clone ==="undefined"){        Object.prototype.clone = function(){};        }    //    for(var i in man){        if (man.hasOwnProperty(i)) { //filter,只输出man的私有属性            console.log(i,":",man[i]);        };    }    //输出结果为print hands:2,legs:2,heads:1    for(var i in man) {//不使用过滤        console.log(i,":",man[i]);    }        //输出结果为    //hands : 2 index.html:20    //legs : 2 index.html:20    //heads : 1 index.html:20    //clone : function (){}     for(var i in man) {        if(Object.prototype.hasOwnProperty.call(man,i)) { //过滤            console.log(i,":",man[i]);        }    }   //输出结果为print hands:2,legs:2,heads:1</script>

兼容值类型的JavaScript对象Clone方法

在JavaScript面向对象编程中使用继承(5)

javascript构造函数与prototype

javascript 冒号 使用说明

代码最终查到了浅谈Javascript 中几种克隆(clone)方式

function clone(obj) {    var o;    if (typeof obj == "object") {        if (obj === null) {            o = null;        } else {            if (obj instanceof Array) {                o = [];                for (var i = 0, len = obj.length; i < len; i++) {                    o.push(clone(obj[i]));                }            } else {                o = {};                for (var j in obj) {                    o[j] = clone(obj[j]);                }            }        }    } else {        o = obj;    }    return o;




0 0
原创粉丝点击