1.数组及对象拷贝:
浅拷贝var b=$.extend(false,{},a);//对象浅拷贝
var a={aa:111,bb:{bb1:22}}; var b=$.extend(false,{},a) JSON.stringify(a); "{"aa":111,"bb":{"bb1":22}}" JSON.stringify(b); "{"aa":111,"bb":{"bb1":22}}" b.bb.bb1=3300; JSON.stringify(b); "{"aa":111,"bb":{"bb1":3300}}" JSON.stringify(a); "{"aa":111,"bb":{"bb1":3300}}"
深拷贝:var b=$.extend(true,{},a);//对象深拷贝
var a={aa:111,bb:{bb1:22}}; var b=$.extend(true,{},a) JSON.stringify(a); "{"aa":111,"bb":{"bb1":22}}" JSON.stringify(b); "{"aa":111,"bb":{"bb1":22}}" b.bb.bb1=10000; 10000 JSON.stringify(a); "{"aa":111,"bb":{"bb1":22}}" JSON.stringify(b); "{"aa":111,"bb":{"bb1":10000}}"
对象合并:$.extend(a,b);
var a={aa:111,bb:222}; var b={bb:333,cc:444}; var res=$.extend(a,b); JSON.stringify(a) "{"aa":111,"bb":333,"cc":444}" JSON.stringify(b) "{"bb":333,"cc":444}" JSON.stringify(res) "{"aa":111,"bb":333,"cc":444}"
2.元素拷贝
var tr=th.clone();
tr.find("th").children().remove();不影响th
3.实现原理
$ = { //浅拷贝
extend : function(target, options) {
for (name in options) {
target[name] = options[name];
}
return target;
}
};
$ = { //深拷贝
extend : function(deep, target, options) {
for (name in options) {
copy = options[name];
if (deep && copy instanceof Array) {
target[name] = $.extend(deep, [], copy);
} else if (deep && copy instanceof Object) {
target[name] = $.extend(deep, {}, copy);
} else {
target[name] = options[name];
}
}
return target;
}
};
extend : function(target, options) {
for (name in options) {
target[name] = options[name];
}
return target;
}
};
$ = { //深拷贝
extend : function(deep, target, options) {
for (name in options) {
copy = options[name];
if (deep && copy instanceof Array) {
target[name] = $.extend(deep, [], copy);
} else if (deep && copy instanceof Object) {
target[name] = $.extend(deep, {}, copy);
} else {
target[name] = options[name];
}
}
return target;
}
};
具体分为三种情况:
a. 属性是数组时,则将target[name]初始化为空数组,然后递归调用extend;
b. 属性是对象时,则将target[name]初始化为空对象,然后递归调用extend;
c. 否则,直接复制属性。