通过源对象扩展目标对象的属性,源对象属性将覆盖目标对象属性。
默认情况下为,复制为浅复制。如果第一个参数为true表示深度复制
$.extend的源码详解
1 $.extend = function (target) { 2 var deep, args = slice.call(arguments, 1)//对传递不确定的参数进行截取,截取掉第一个,默认第一个参数用来判断是浅复制还是深复制,(false是默认为浅复制,true是深复制) (slice.call http://www.cnblogs.com/sunnie-cc/p/6797786.html) 3 if (typeof target == 'boolean') {//判断是否有要深复制 4 deep = target 5 target = args.shift()//args移除数组的第一个,会将第一个(目标元素)返回赋值给target 6 } 7 args.forEach(function (arg) { 8 extend(target, arg, deep) 9 }) 10 return target 11 } 12 13 function extend(target, source, deep) { 14 for (key in source)//一条语句(以;结束的)时,可以不用打{ } 15 if (deep && (isPlainObject(source[key]) || isArray(source[key]))) {//是引用类型(object、array)的值就深复制 (引用、值类型 http://www.cnblogs.com/sunnie-cc/p/6801331.html) 16 if (isPlainObject(source[key]) && !isPlainObject(target[key])) 17 target[key] = {}//原是一个Object,如果目标元素不是则设置为Object; 18 if (isArray(source[key]) && !isArray(target[key])) 19 target[key] = []//原是一个Array,如果目标元素不是则设置为Array; 20 extend(target[key], source[key], deep)//实现一个递归的去调用extend 21 } 22 else if (source[key] !== undefined) target[key] = source[key]//浅复制(如果是值类型复制是不可改变的), 23 // 因为target是数组也就是应用类型,如有改变,传进的参数target对应的值也会改变(eg:在 extend(target, arg, deep)中的target会变) 24 }