// Prevent never-ending loop
if ( target === copy ) {
continue;
}
如果源对象的某个属性值就是目标对象可能会造成死循环导致程序崩溃所以这里做了一个限制让其跳过此次循环例如:
复制代码 代码如下:
var o = {};
o.n1 = o;
$.extend( true, o, { n2: o } );
// 抛出异常:
// Uncaught RangeError: Maximum call stack size exceeded
但是这样做也会冤枉一些正常的情况比如:
复制代码 代码如下:
var obj1={a:'a'}
var obj2={a:obj1};
console.log($.extend(obj1,obj2)); //Object {a: "a"}
这种情况也是满足源对象值等于目标对象的但是结果发现obj1的a的属性值并没有被修改,就是因为执行了continue,下面把源码的这段话注释掉在执行
复制代码 代码如下:
Object {a: Object}
这个时候就是正常被修改了个人感觉这个地方需要改进;
接着就是一个if判断就是区分是不是进行深度复制的先不看深度复制的先看一般的
复制代码 代码如下:
target[ name ] = copy;
很简单就是只要copy有值就直接复制给目标对象,目标对象有的就修改没有就增加,这样就实现了合并啦。
for循环之后在把新的目标对象返回,所以目标对象最后是被修改的,而且结果和返回的结果是一样的。
复制代码 代码如下:
// Return the modified object
return target;
};
下面再来说说深度复制了怎么去处理
首先保证deep是true,copy有值并且是对象或者数组(如果不是对象和数组深度复制也就无从谈起)然后再分数组和对象来处理,先来看数组的情况:
复制代码 代码如下: