而如果第一个参数boolean为false,我们看看合并的结果是什么,如下:
var result=$.extend( false, {},{ name: "John", location:{city: "Boston",county:"USA"} },
{ last: "Resig", location: {state: "MA",county:"China"} } );
那么合并后的结果就是:
result={name:"John",last:"Resig",location:{state:"MA",county:"China"}}//浅拷贝,对copy对象同名属性值类型为数组或对象的属性直接覆盖/重写。来看下深拷贝和前拷贝怎么实现的:
if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { if ( copyIsArray ) { copyIsArray = false; clone = src && jQuery.isArray(src) ? src : []; } else { clone = src && jQuery.isPlainObject(src) ? src : {}; } target[ name ] = jQuery.extend( deep, clone, copy ); } else if ( copy !== undefined ) { target[ name ] = copy; }(1)、浅拷贝:target[ name ] = copy;直接覆盖和容易理解。
(2)、深拷贝稍显复杂,首先判断是数组还是对象,在对嵌套子对象递归调用$.extend方法。
4、jQuery多库共存处理
$符号已经被很多库作为作为命名空间,因此不免会与别的库框架或者插件相冲突。
jQuery引入noConflict函数可以将变量$的控制权让给第一个实现它的那个库,确保jQuery不会与其他库的$对象发生冲突。在运行这个函数后,就只能使用jQuery变量访问jQuery对象。下面来看看代码如何处理的?
var // Map over jQuery in case of overwrite _jQuery = window.jQuery,//外部库重写了jQuery,先缓存 // Map over the $ in case of overwrite _$ = window.$;//外部库重写了$,先缓存起来 jQuery.noConflict = function( deep ) { if ( window.$ === jQuery ) {//把全局$的控制权交出去,此处,jQuery为局部变量 window.$ = _$; } if ( deep && window.jQuery === jQuery ) {//把全局jQuery的控制权也交出去,此处局部jQuery与全局jQuery做对比 window.jQuery = _jQuery; } return jQuery; }; 如果我们需要同时使用jQuery和其他JavaScript库,我们可以使用 $.noConflict()把$的控制权交给其他库。旧引用的$ 被保存在jQuery的初始化; noConflict() 简单的恢复它们。
通过类似swap交换的概念,先把之前的存在的命名空间给缓存起来_$,_jQuery,通过对比当前的命名空间达到交换的目的,首先,我们先判断下当前的的$空间是不是被jQuery接管了,如果是则让出控制权给之前的_$引用的库,如果传入deep为true的话等于是把jQuery的控制权也让出去了
那么具体何时调用才不会引起库命名空间冲突问题呢:这个函数必须在你导入jQuery文件之后,并且在导入另一个导致冲突的库之前使用。