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

预备知识:

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

值类型和引用类型的区别

数组和对象的遍历方法

递归算法

预计工作量

半小时

具体描述

实现方法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] + "	";
        } 
    } 
    // 最后显示所有的属性
    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>

代码最终查到了

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;




经验分享 程序员 微信小程序 职场和发展