jQuery extend

jquery提供的extend,主要是將其他object的屬性,copy到target這個object

jQuery.extend( target, [ object1 ], [ objectN ] );

extend return時,與target是同一個object

相當於以下的code:
for(var name in object)
target[ name ] = object[name];

但是這樣會有一個問題,當object裡的屬性有object或是array時,他並不會配置新的記憶體,而時指向同個記憶體。

</span>
例如:
var object = {key:3,data:{name:"sparrow"}};
var target = {};
    $.extend(target,object);
    //result:sparrow
    console.log(object.data.name);
    target.data["name"] = "peter";
    //result:peter
    console.log(target.data.name);
    console.log(object.data.name);
    

所以這時jquery有提供一個deep參數:

jQuery.extend( [ deep ], target, object1, [ objectN ] )

deep會true時,他會用遞迴的方式,將arrayobject配置一個新的空間,然後將值複製過去。

jquery主要copy source code如下:

// Recurse if we're merging plain objects or arrays
if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
if ( copyIsArray ) {
copyIsArray = false;
clone = src && jQuery.isArray(src) ? src : [];

} else {
     clone = src &amp;&amp; jQuery.isPlainObject(src) ? src : {};
}    

 // Never move original objects, clone them
     target[ name ] = jQuery.extend( deep, clone, copy );

// Don't bring in undefined values
} else if ( copy !== undefined ) {
target[ name ] = copy;