一、浅拷贝与深拷贝区别

1.浅拷贝只能实现浅层次的值复制和路径复制,当值为引用类型是传递过去的是一个地址,当改变其中一值时,两者都会发生改变。

2.深拷贝会对对象进行深层次的复制,也就是当值为引用类型时会循环直到值为基本值类型时才会复制。

3.实现jQuery的extend的深浅拷贝功能

//参数解析
/*
* deep: true或false,默认值false,为true时表示深拷贝
* {}目标对象,多个对象拷贝之后的结果
* {}、{}、{}、{}被拷贝的对象
*/
function extend(){
    var target = arguments[0] || {};
    var deep = false;
    var tar = arguments.length;
    var arr = Array.prototype.slice.call(arguments);  
    var i=1;
    var options,src,key,copy;
    var isArray = false;
    if( typeof target === "boolean" ){
        deep = target;
        i++;
        target = arguments[1];
    }
    for( ;i<arr.length;i++  ){  //循环传入的对象数组
        if( (options = arr[i] ) != null ){ //如果当前值不是null,如果是null不做处理
            for( key in options ){ //for in循环对象中key
                copy = options[key];
                src = target[key];
                //如果对象中value值任然是一个引用类型
                if( deep && ( toString.call( copy ) == "[object Object]" || ( isArray = toString.call( copy ) == "[object Array]") ) ){
                    if( isArray ){ //如果引用类型是数组
                        //如果目标对象target存在当前key,且数据类型是数组,那就还原此值,如果不是就定义成一个空数组;
                        src = toString.call( src ) == "[object Array]" ? src : [];
                    }else{
                        //如果目标对象target存在当前key,且数据类型是对象,那就还原此值,如果不是就定义成一个空对象;
                        src = toString.call( src ) == "[object Object]" ? src : {};
                    }
                    //引用类型就再次调用extend,递归,直到此时copy是一个基本类型的值。
                   target[key] = extend( deep , src , copy );
                }else if( copy != undefined && copy != src ){  //如果这个值是基本值类型,且不是undefined
                    target[key] = copy;
                }
            }
        }
    }
    return target;
}

xqslsm
21 声望0 粉丝