js对象拷贝
深拷贝
var clone = function (obj) {
if(obj === null) return null
if(typeof obj !== 'object') return obj;
if(obj.constructor===Date) return new Date(obj);
var newObj = new obj.constructor (); //保持继承链
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
//不遍历其原型链上的属性
var val = obj[key];
newObj[key] = typeof val === 'object' ? arguments.callee(val) : val;
// 使用arguments.callee解除与函数名的耦合
}
}
return newObj;
};
function deepClone(initalObj, finalObj) {
var obj = finalObj || {};
for (var i in initalObj) {
var prop = initalObj[i];
// 避免相互引用对象导致死循环,如initalObj.a = initalObj的情况
if(prop === obj) {
continue;
}
if (typeof prop === 'object') {
obj[i] = (prop.constructor === Array) ? [] : Object.create(prop);
} else {
obj[i] = prop;
}
}
return obj;
}
浅拷贝
var obj = this.addresslist[i];
for (var key in obj ){
if (obj.hasOwnProperty(key)) {
var val = obj[key];
this.elinfo[key] = typeof val === 'object' ? arguments.callee(val) : val;
// 使用arguments.callee解除与函数名的耦合
}
}
原理
使用引用类型时,声明的变量存储的是引用类型在内存中的地址