$.extend

通过源对象扩展目标对象的属性,源对象属性将覆盖目标对象属性。

默认情况下为,复制为浅复制。如果第一个参数为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 }
原文地址:https://www.cnblogs.com/sunnie-cc/p/6797977.html