if ( copyIsArray ) {
copyIsArray = false;
clone = src && jQuery.isArray(src) ? src : [];
} else {
clone = src && jQuery.isPlainObject(src) ? src : {};
}
如果是数组copyIsArray的值为真然后走里面的 把值改成false ,针对当前循环的源对象属性,目标对象可能有也可能没有,有的话判断一下是不是数组是的话就是原来的数组不变不是的话就让它变成一个数组,因为既然源对象的当前属性是数组最后目标元素也必须是数组。不是数组就是对象把目标对象当前属性改成对象。
复制代码 代码如下:
// Never move original objects, clone them
target[ name ] = jQuery.extend( deep, clone, copy );
然后把源对象的当前属性值(是数组或对象)和已经被改造过的目标对象的当前属性进行递归合并最后返回的新的数组或者对象赋值给目标对象,最终实现了深度复制。
但是这里面还有一个比较奇怪的现象,比如这样操作:
复制代码 代码如下:
console.log($.extend({a:1},'aa')); //Object {0: "a", 1: "a", a: 1}
原来源对象不一定真的是对象e而且居然可以把字符串拆开跟目标对象合并,原来for...in循环是操作字符串的
复制代码 代码如下:
var str='aa';
for(var name in str){
console.log(name);
console.log(str[name])
}
这样也是可以的,会把字符串拆开按数字下标读取,但是在源码中
复制代码 代码如下:
if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) )
是有数组和对象限制的,那么深度复制的时候是不是就没有效果了呢?
经过我测试深度复制也是可以的,因为在源码里面copy的值竟然变成了匿名函数函数
alert(jQuery.isPlainObject(copy)); //true
至于为什么是函数笔者还没搞清楚留待以后解决吧!
您可能感兴趣的文章: